【问题标题】:Add a key with multiple values to nested JSON将具有多个值的键添加到嵌套 JSON
【发布时间】:2020-06-03 22:02:20
【问题描述】:

我有一个这样的 JSON 变量:

json_file = {

 "Line 1": [
    {"HFGR62"},
    {"K6RTFV"},
    {"86G37F"}
 ],

 "Line 2": [
    {"FG3RH5"},
    {"45H4H4"},
    {"H4HTH5"}
 ]

}

还有一个看起来像这样的字符串:

string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla bla <G4H65>"

我需要首先提取文本“第 3 行”并将其作为键附加到上面的 json_file 中,然后我需要找到“”中的所有数字/字母并将它们作为值附加。

我尝试了以下方法:

line = re.match('{(.+?)}', string)
json_file[line.group(1)] = json_file

brackets = re.findall('<(.+?)>', string)
for element in brackets:
   json_file[line.group(1)] = ({element})

脚本添加了一个新密钥,但只有最后一个...

有什么想法吗?

【问题讨论】:

  • 这不是一个有效的 JSON ({"HFGR62"})。

标签: python json python-3.x regex


【解决方案1】:

set() 不是有效的 JSON 类型,请改用简单字符串:

string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla bla <G4H65>"

current_key = ''
for k, v in re.findall(r'{(.*?)}|<(.*?)>', string):
    if k:
        json_file[k] = []
        current_key = k
    else:
        json_file[current_key].append(v)

import json
print(json.dumps(json_file, indent=4))

打印:

{
    "Line 1": [
        "HFGR62",
        "K6RTFV",
        "86G37F"
    ],
    "Line 2": [
        "FG3RH5",
        "45H4H4",
        "H4HTH5"
    ],
    "Line 3": [
        "F3465",
        "G46H6",
        "4H6HH",
        "4TH56",
        "G4H65"
    ]
}

【讨论】:

    【解决方案2】:

    解决方案

    使用regex(正则表达式)+json库来更正格式不正确的json文件。

    json 文件的 json 结构不正确。因此,最简单的解决方法是将每个{"ABCXYZ"} 替换为{"ABCXYZ": null}。这将允许您使用 json 库将其作为 json 文件读取,如下所示。

    我们使用re.sub() 替换您的 json 文件中的所有此类事件。

    注意:我没有将结构从list of {&lt;something&gt;} 更改为list of &lt;something&gt;,只是为了避免这种情况,如果您有任何类似{&lt;something&gt;: &lt;somevalue&gt;} 的条目。

    import re # regex
    import json
    ss = re.sub(r'{(".*?")}', r'{\1: null}', s)
    print(ss)
    # Load as json
    d = json.loads(ss)
    print(d)
    

    输出

    ## print(ss)
    {
    
     "Line 1": [
        {"HFGR62": null},
        {"K6RTFV": null},
        {"86G37F": null}
     ],
    
     "Line 2": [
        {"FG3RH5": null},
        {"45H4H4": null},
        {"H4HTH5": null}
     ]
    
    }
    
    ## print(d)
    
    {'Line 1': [{'HFGR62': None}, {'K6RTFV': None}, {'86G37F': None}],
     'Line 2': [{'FG3RH5': None}, {'45H4H4': None}, {'H4HTH5': None}]}
    

    【讨论】:

      【解决方案3】:

      试试这个:

      line = re.match('{(.+?)}', string)
      #json_file[line.group(1)] = json_file COMMENT/DELETE THIS LINE!!!
      
      brackets = re.findall('<(.+?)>', string)
      for element in brackets:
          if line.group(1) in json_file:
              json_file[line.group(1)].append({element})
          else:
              json_file[line.group(1)] = [{element}]
      

      【讨论】:

        【解决方案4】:

        使用 re.findall('RegexString',variable)

        >>> string = "{Line 3} Bla bla bla <F3465> <G46H6> bla bla bla <4H6HH> bla <4TH56> bla 
        bla <G4H65> {Line 2}"
        >>> import re
        >>> line = re.findall('{(.+?)}', string)
        >>> print(line)
        ['Line 3', 'Line 2']
        >>> lineTemp = re.match('{(.+?)}', string)
        >>> print(lineTemp.groups())
        ('Line 3',)
        >>> 
        

        re.match() 函数将搜索正则表达式模式并返回第一个匹配项。此方法仅在字符串的开头检查匹配项。因此,如果在第一行中找到匹配项,则返回匹配对象。但如果在其他行中找到匹配项,则返回 null。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-10
          相关资源
          最近更新 更多