Как избавиться от обратной косой черты во вложенном json - PullRequest
0 голосов
/ 23 апреля 2019

Я делаю запрос к бэкэнд-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"
    },

...
]

Мне нужно избавиться от

  1. "\" во всех ключах тела в ответе json
  2. Объединить ключ [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 голосов
/ 23 апреля 2019

Данные JSON неправильно отформатированы и недопустимы в формате JSON (пропущены кавычки в строках "ключа" (например, code": 200,), неверный синтаксис в объекте тела второго словаря, как упоминается в комментарии (например, "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'}]
0 голосов
/ 23 апреля 2019

(Для начала, то, что вы дали, является недействительным JSON, и json либо не сможет его полностью проанализировать, либо выдаст что-то поддельное. Вам нужно убедиться, что вы правильно распаковали ответ, и если это действительно то, чтоответ: пусть отправляющая сторона исправит это.)
Теперь о вопросе, который был задан:


Вам не нужно делать ничего особенного.Именно так JSON представляет значения, которые сами содержат специальные символы JSON («экранирует» их обратной косой чертой).

Если вы загрузите данные с помощью правильного синтаксического анализатора JSON (например, json.loads()), он отменит этот выходи, например, data[0]['body'], вы увидите правильные данные.

Конечно, поскольку эта строка сама по себе JSON, вам потребуется дополнительно проанализировать ее также с помощью json, если вам нужно разделить еена его значимые части ...

...