Как мне разобрать такие json в Python? - PullRequest
0 голосов
/ 01 августа 2020
[
  {
    "sets": "{\"sets\":[[15,12,10,16,22],[1,3,14,14,21],[18,18,19,4,6],[10,23,12,6,13],[4,3,16,6,3],[24,14,20,10,19],[19,16,2,18,9],[8,14,17,11,25],[4,20,4,24,13]],\"worn\":[1,3,4,6,7]}"
  }
]

Это выглядит очень странно, не знаю, что делать. Мне нужно, чтобы раздел worn относился к разделу sets. Как будто мне нужен 1-й список, 3-й список, 4-й список, 6-й список и 7-й список. Например, первый список должен подключаться к [15,12,10,16,22]. Я пробовал set['worn'][0], который говорит, что возвращает KeyError, поскольку worn не является ключом. Я также пробовал set['sets'][-1] в попытке получить окончательный результат, который, как мне кажется, является списком после worn, но на самом деле он просто возвращает весь блок, так как фактический Key кажется первым sets и не второе.

Я хочу научиться интерпретировать это в будущем, но моя цель - получить 5 чисел после worn и найти соответствующие sets для этих чисел, а затем добавить первое значение каждого списка вместе, второе значение каждого вместе, et c, вплоть до суммирования до 5.

Загрузка json с:

            scan = f"link"
            async with aiohttp.ClientSession() as cs:
                async with cs.get(scan) as r:
                    set = json.loads(await r.text())

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Это несколько необычно JSON. Это массив с единственным элементом, который является объектом «множества». Этот объект представляет собой строку :

"{\"sets\":[[15,12,10,16,22],[1,3,14,14,21],[18,18,19,4,6],[10,23,12,6,13],[4,3,16,6,3],[24,14,20,10,19],[19,16,2,18,9],[8,14,17,11,25],[4,20,4,24,13]],\"worn\":[1,3,4,6,7]}"

Эта строка является допустимым объектом JSON и может быть проанализирована.

json Ошибки .loads вызваны символ новой строки '\n'. Чтение этого JSON из файла или подобного ему объекта исправляет ошибки. Я сохранил ваш json в файл.

$ cat s.json 
[
  {
    "sets": "{\"sets\":[[15,12,10,16,22],[1,3,14,14,21],[18,18,19,4,6],[10,23,12,6,13],[4,3,16,6,3],[24,14,20,10,19],[19,16,2,18,9],[8,14,17,11,25],[4,20,4,24,13]],\"worn\":[1,3,4,6,7]}"
  }
]

и проанализировал его.

import json

with open('s.json') as f: 
    j = json.load(f)[0]
j1 = json.loads(j['sets'])

sets = j1['sets']
worn = j1['worn']

print(sets)
print(worn)

Результаты:

[[15, 12, 10, 16, 22], [1, 3, 14, 14, 21], [18, 18, 19, 4, 6], [10, 23, 12, 6, 13], [4, 3, 16, 6, 3], [24, 14, 20, 10, 19], [19, 16, 2, 18, 9], [8, 14, 17, 11, 25], [4, 20, 4, 24, 13]]
[1, 3, 4, 6, 7]
  
0 голосов
/ 09 августа 2020

Ни один из ответов не сработал для меня и продолжал выдавать разные ошибки, но решение Юрия помогло мне попробовать взглянуть на это с другой точки зрения. Я не уверен, почему json не загружался с предложенными решениями, но мне пришлось использовать eval, чтобы он отображал то, что я хотел. Вот что я сделал:

            scan = f"link"
            async with aiohttp.ClientSession() as cs:
                async with cs.get(scan) as r:
                    set = json.loads(await r.text())
                    set = set[0]['sets']
                    set = eval(set)
                    setW = set['worn']

Я не слишком разбираюсь в eval, за исключением того, что многие люди говорят избегать его использования, но после использования eval на json он позволил мне получить доступ другие ключи и приступить к тому, что мне нужно было сделать дальше.

...