格式化json字符串以使用json.loads()

时间:2019-07-12 23:29:18

标签: python json python-3.x

我已经从如下所示的API接收到json格式的字符串:

cron_restart

试图使其与json.loads一起使用,但出现错误:


string = ' {\n  "Ids": ["abc-765"],\n  "Type": "Column",\n  "Number": "021649015",\n  "Code": "02109998000",\n  "Text": , \n}'

我认为这是因为最后一个键中缺少值以及附加的尾部逗号。

有没有一种方法可以格式化字符串以使其与json.loads一起使用?

2 个答案:

答案 0 :(得分:0)

不做一些假设就不可能。所有这些假设都必须正确才能使算法起作用:

  • 第一行始终只有{
  • 最后一行始终仅是}
  • 所有其他行仅包含字典的一对键值对
import json


def fix_json(string):
    modifiedLines = []
    for line in string.splitlines()[1:-1]:
        line = line.strip()
        if line.endswith(','):
            line = line[:-1].strip()
        if line.endswith(':'):
            line = line + "null"
        modifiedLines.append(line)
    return '{\n' + ',\n'.join(modifiedLines) + '\n}'


string = ' {\n  "Ids": ["abc-765"],\n  "Type": "Column",\n  "Number": "021649015",\n  "Code": "02109998000",\n  "Text": , \n}'

modifiedString = fix_json(string)
jsonData = json.loads(modifiedString)
print(jsonData)
{'Ids': ['abc-765'], 'Type': 'Column', 'Number': '021649015', 'Code': '02109998000', 'Text': None}

答案 1 :(得分:0)

如果知道所需的键,则可以将它们添加到列表中并使用正则表达式在此列表中进行迭代以找到关联的值:

for json_key in json_keys:
    val = None
    try:
        val = re.search(json_key+'": (.*),', string).group(1)
    catch AttributeError: # Key does not exist
        pass
    catch Exception as e:
        raise e from None

这些值需要进一步验证/修复(即,从开头和结尾删除多余的“”),但您可以将它们添加到键:值字典中,并将其传递给

import json 
new_string = json.dumps(json_dict)