Обход и доступ к внутренним элементам в JSON - PullRequest
6 голосов
/ 24 апреля 2020

У меня есть вложенный документ JSON, и я хочу обновить в нем элементы. Ниже приведен файл JSON. Я также несколько раз проверил это JSON через онлайн-форматирование.

{
    "j1": [{
        "URL": "http://localhost/",
        "Data": "{\"dump\":[{values:[{time:1586826385724,val:5.12},{time:1587576460460,val:3.312}]}]}"
    }]
}

В этом я хочу получить доступ к «значениям» и добавить имя элемента: AB C и имя: CBA в последующих записях .

{values:[{name:'ABC',time:1586826385724,val:5.12},
{name:'CBA',time:1587576460460,val:3.312}]}

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

Попытка использования объекта dict

import json
   with open("new1.json") as json_file:
   data = json.load(json_file)
   data['json1'][0]['DownloadData'][0:]

Я пытался использовать objectpath библиотеку для json обхода элемента, но извлекал пустой набор результатов

#trying with objectpath lib
 import json
    import objectpath
    with open("new1.json") as json_file:
    data = json.load(json_file)
    jsonnn_tree = objectpath.Tree(data['json1'])    
    result_tuple = tuple(jsonnn_tree.execute('$..values'))

Я понимаю, что не должен запрашивать прямой код, но не смог найти что-либо релевантное в этом контексте при доступе к вложенному JSON / словарю. Будучи новичком, подумал о том, чтобы найти здесь какое-то руководство.

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

Это расслабленный JSON формат. Есть расслабленный JSON парсер для Python. Вот пример:

>>> import relaxedjson
>>> relaxedjson.parse('{moose: "goose"}')
{'moose': 'goose'}
4 голосов
/ 29 апреля 2020

Для меня, похоже, у вас есть вложенная строка JSON. А внутренний JSON недействителен. Поэтому мы должны исправить это перед разбором.

import json
with open("new1.json") as json_file:
   data = json.load(json_file)
innerstr = data["j1"][0]["Data"]
innerstr = innerstr.replace("values",'"walues"').replace("time",'"time"').replace("val",'"val"').replace("walues","values")
inner = json.loads(innerstr)
#then we can modify inner data as we want
inner["dump"][0]["values"][0]["name"] = "ABC"
inner["dump"][0]["values"][1]["name"] = "CBA"

И теперь у нас есть inner переменная, подобная этой

{'dump': [{'values': [{'name': 'ABC', 'time': 1586826385724, 'val': 5.12},
                      {'name': 'CBA', 'time': 1587576460460, 'val': 3.312}]}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...