在类似JSON的文档中添加非数字原子值的引号

时间:2018-05-17 20:06:21

标签: json jq

我有一个嵌套的类JSON文档,格式如下,我试图用python读取。我试图在非数字原子值周围加上引号("")。我尝试使用带有正则表达式的python:

import re
valid_json = re.sub(r'(?<={|,)([a-zA-Z][a-zA-Z0-9]*)(?=:)', r'"\1"', 
json_data) 

数据文件如下:

{
  "Attri1": 26789381,
  "Attri2": hjewvbfasnd3672183knsa,
  "Attri9": 457950,
  "Attri10": [
    {
      "NestedAtri1": vwebsn632871yb,
      "NestedAttri2": [
        {
          "A1": 0,
          "A2": ABB1,
          "A3": 30,
          "A5": [
            000,001
          ]
        },
        {
          "A1": 0,
          "A2": ABB1,
          "A3": 30,
          "A5": [
            000,001
          ]
        }
      ]
    },
    {
      "NestedAtri1": rgdf3423,
      "NestedAttri2": [
        {
          "A1": 0,
          "A2": C,
          "A3": 50,
          "A5": [
            000,001
         ]
        },
        {
          "A1": 0,
          "A2": ABB1,
          "A3": 30,
          "A5": [
            000,001
          ]
        }
      ]
    }
  ]
}

预期输出带有值周围的引号。

{
  "Attri1": 26789381,
  "Attri2": "hjewvbfasnd3672183knsa",
  "Attri9": 457950,
  "Attri10": [
    {
      "NestedAtri1": "vwebsn632871yb",
      "NestedAttri2": [
        {
          "A1": 0,
          "A2": "ABB1",
          "A3": 30,
          "A5": [
            "000,001"
          ]
        },
        {
          "A1": 0,
          "A2": "ABB1",
          "A3": 30,
          "A5": [
            "000,001"
          ]
        }
      ]
    },
    {
      "NestedAtri1": "rgdf3423",
      "NestedAttri2": [
        {
          "A1": 0,
          "A2": "C",
          "A3": 50,
          "A5": [
            "000,001"
         ]
        },
        {
          "A1": 0,
          "A2": "ABB1",
          "A3": 30,
          "A5": [
            "000,001"
          ]
        }
      ]
    }
  ]
}

有没有办法可以使用python / json或任何其他库添加引号。或者我可以使用jq过滤器来添加引号。 感谢

1 个答案:

答案 0 :(得分:1)

这是一个awk脚本,它将处理你的例子和其他类似的,但它不健壮。例如,它不会正确处理带有嵌入空格的键。

awk '
   function ws(line,  s) {
     s=line; sub(/[^    ].*/, "", s);
     return s;
   }

   # Global: $0
   # print a value with quotation marks, checking for punctuation
   function printit(s,  w) {
     if ( s ~ /^[\[{]$/ ) { print $0; return}
     w=s; sub(/,$/, "", w);
     printf "\"%s\"", w;
     if (w != s) {printf "%s", ","}
     print "";
   }

   NF==1 && ($1 ~ /^[][{}],?$/) { print; next }
   NF==2 && ($2 ~ /^[][{}],?$/) { print; next }
   NF==2 && ($2 ~ /^[0-9]+,?$/) { print; next } 
   NF==2 && ($2 ~ /^".*",?/   ) { print; next } 

   # key: value
   $1 ~ /^".*":$/ {
     printf "%s", ws($0) $1 " ";
     $1=""; sub(/^ /,"",$0); printit($0);
     next;
   }

   NF == 1 {
     printf "%s", ws($0);  # indentation
     printit($1);
     next;
   }
   {print}
'