【问题标题】:How do I parse this kind of json in Python?如何在 Python 中解析这种 json?
【发布时间】:2020-08-01 12:20:22
【问题描述】:
[
  {
    "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 之后的列表的最终结果,但它实际上只是返回整个块,因为实际的密钥似乎是第一个sets 和不是第二个。

我想在未来学习如何解释这个,但我的目标是获取worn 之后的 5 个数字并为这些数字找到对应的sets,然后将每个列表的第一个值加在一起, 每个加在一起的第二个值,等等,直到 5 加在一起。

使用以下方式加载 json:

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

【问题讨论】:

  • import json; json.loads(data[0]['sets']) ??
  • scan = f"link" async with aiohttp.ClientSession() as cs: async with cs.get(scan) as r: set = json.loads(await r.text()) 当我尝试时它一直给我 TypeError 但也许我不能使用这种方法来加载这种 json?我以前从未使用过它。如果我可以使用这个,你能给我一个例子来说明你的意思吗? json不是我的。这是网上的东西
  • 我也无法将您的字符串加载到json.loads()。如果无法使其与json.loads() 兼容,则可以使用标准的python 列表和字符串操作技术到达您想要的位置。
  • 我想我明白你的意思了。我会尝试。泰

标签: python json parsing math


【解决方案1】:

这是有点花哨的 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]
  

【讨论】:

  • 有趣的是,将字符串保存在文件中并使用json.load() 可以,但直接使用json.loads() 读取不起作用。
  • @JackFleeting 从文件读取(或直接从 URL 作为文件对象)将 \\ 前置到换行符,因此文本可以是有效的 Python 字符串。
【解决方案2】:

没有一个答案对我有用,并且不断给我不同的错误,但 Yuri 的解决方案帮助我尝试从不同的角度看待它。我不确定为什么 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,但是在 json 上使用 eval 之后,它允许我访问其他键并继续我接下来需要做的事情。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2023-03-05
    • 2021-11-21
    • 2020-08-10
    相关资源
    最近更新 更多