如何摆脱嵌套json

时间:2019-04-23 00:55:51

标签: python json regex python-requests

我向后端API发出请求,并以json格式获取数据

响应看起来像这样。请注意,主体键值将有所不同,其中有100多个。 data1.json看起来像这样

[
    {
        "body": "[{\"task_ids\":[],\"accounts\":[],\"entity_ids\":[12814],\"guid\":\"2DFEB337-5F5D-4DF5-84CF-E951D237D448\",\"id\":\"0034030fb97251b3\",\"subject\":\"Uploaded Application\"}]",
        code": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "msg": "OK",
        "name": "0"
    },
   {
        "body": "[{\"task_ids\":[],\"accounts\":[],\"entity_ids\":[12814],\"guid\":\"2DFEB337-5F5D-4DF5-84CF-E951D237D448\",\"id\":\"0034030fb97251b3\",\"subject\":\"Uploaded Application\",\}]",
        code": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "msg": "OK",
        "name": "0"
    },

...
]

我需要摆脱

    json响应中所有主体键中的
  1. “ \”
  2. 将key [body']连接到一个数组中

理想情况下,它应该看起来像这样。

[
  {"body":"[{"task_ids":[],"accounts":[],"entity_ids":[12814],"guid":"2DFEB337-5F5D-4DF5-84CF-E951D237D448","id":"0034030fb97251b3","subject":"Uploaded Application",]","[{"task_ids":[],"accounts":[],"entity_ids":[12814],"guid":"2DFEB337-5F5D-4DF5-84CF-E951D237D448","id":"0034030fb97251b3","subject":"Uploaded Application",]",..}


]

我尝试了替换操作,但是有很多方法都没有替换\,所以我什至无法执行第2步。我发现,如果将其保存到文本文件中,则替换了反斜杠,但是随后我无法再次将响应作为json对象发送回。到目前为止,获取data1.json文件的代码如下。

data = json.loads(r.text)


with open('data1.json', 'w') as outfile:
     json.dump(data, outfile, sort_keys = True, indent = 4,
               ensure_ascii = False)

关于如何达到期望输出中的第一点的任何建议?谢谢。

2 个答案:

答案 0 :(得分:0)

(对于初学者来说,您提供的是无效的JSON,而json将无法完全解析它或产生伪造的东西。您需要确保正确提取了响应,如果是真正的回应是,请发送方对其进行修复。)
现在,关于所问的问题:


您不需要做任何特别的事情。这就是JSON表示本身包含JSON特殊字符(用反斜杠“转义”)的值的方式。

如果您通过适当的JSON解析器(例如json.loads())加载数据,它将撤消这种转义,例如data[0]['body'],您将看到正确的数据。

当然,由于该字符串本身就是JSON,因此,如果需要将其拆分为有意义的部分,则还需要进一步用json对其进行解析...

答案 1 :(得分:0)

JSON数据格式错误,并且JSON无效(“键”字符串中缺少引号(例如code": 200,),第二个词典主体对象中的语法无效,例如mentioned in comment(例如"Uploaded Application\",\}]" ))。

但是,修复这些问题后,可以使用简单的str.replace()语句来获取预期的JSON格式。然后,只需解析JSON内容并构建所需的列表:

import json

data = '''[
    {
        "body": "[{\"task_ids\":[],\"accounts\":[],\"entity_ids\":[12814],\"guid\":\"2DFEB337-5F5D-4DF5-84CF-E951D237D448\",\"id\":\"0034030fb97251b3\",\"subject\":\"Uploaded Application\"}]",
        "code": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "msg": "OK",
        "name": "0"
    },
   {
        "body": "[{\"task_ids\":[],\"accounts\":[],\"entity_ids\":[12814],\"guid\":\"2DFEB337-5F5D-4DF5-84CF-E951D237D448\",\"id\":\"0034030fb97251b3\",\"subject\":\"Uploaded Application\"}]",
        "code": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "msg": "OK",
        "name": "0"
    }
]'''

r = json.loads(data.replace('\\', '').replace('"[', "[").replace("]\"", "]"))

l = []

for d in r:
    l.append(d)

现在检查l的内容:

>>> l
[{u'body': [{u'entity_ids': [12814], u'accounts': [], u'task_ids': [], u'guid': u'2DFEB337-5F5D-4DF5-84CF-E951D237D448', u'id': u'0034030fb97251b3', u'subject': u'Uploaded Application'}], u'headers': {u'Content-Type': u'application/json'}, u'code': 200, u'name': u'0', u'msg': u'OK'}, 
{u'body': [{u'entity_ids': [12814], u'accounts': [], u'task_ids': [], u'guid': u'2DFEB337-5F5D-4DF5-84CF-E951D237D448', u'id': u'0034030fb97251b3', u'subject': u'Uploaded Application'}], u'headers': {u'Content-Type': u'application/json'}, u'code': 200, u'name': u'0', u'msg': u'OK'}]