【问题标题】:Python parsing json from stringPython从字符串解析json
【发布时间】:2021-10-29 15:22:15
【问题描述】:

我需要从 Web 服务返回的部分字符串中解析 json。我有以下 sn-p 代码,它工作正常但非常难看。有没有更好或更清洁的方法来做到这一点?

x = '"1":{"name":"item one","code":"1"},"2":{"name":"item two","code":"2"},"3":{"name":"item three","code":"3"}'
split = x.split('},')
index = 0
for s in split:
    split[index] = '{' + s + '}}'
    index += 1
joined = ','.join(split)
joined = '[' + joined[:-1] + ']'
j = json.loads(joined)
print(j)

结果如下:

[{'1': {'name': 'item one', 'code': '1'}},
 {'2': {'name': 'item two', 'code': '2'}},
 {'3': {'name': 'item three', 'code': '3'}}]

【问题讨论】:

  • 你不能只做x = json.loads("{" + x + "}")然后做任何你喜欢的事情作为dict吗?
  • @JonSG 这不会产生相同的预期输出。
  • 我要做的第一件事是找出是否可以将 Web 服务更改为返回真正的 JSON。
  • @Selcuk 是的,这不是一个完整的解决方案,但我看到您能够将它用作解决方案的核心,这是我的意图。

标签: python json python-3.x parsing


【解决方案1】:

你可以使用下面的sn-p:

>>> [dict([t]) for t in json.loads(f"{{{x}}}").items()]
[{'1': {'name': 'item one', 'code': '1'}},
 {'2': {'name': 'item two', 'code': '2'}},
 {'3': {'name': 'item three', 'code': '3'}}]

【讨论】:

    【解决方案2】:

    您可以手动修复不一致(添加缺少的大括号)并使用json模块进行解析:

    data = json.loads('{' + x + '}')
    

    然后就可以将解析后的数据转换成想要的表示了:

    [{item[0]: item[1]} for item in data.items()]
    
    #[{'1': {'name': 'item one', 'code': '1'}}, 
    # {'2': {'name': 'item two', 'code': '2'}}, 
    # {'3': {'name': 'item three', 'code': '3'}}]
    

    否则,您最终将实现自己的 JSON 解析器,这并非易事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2016-06-29
      相关资源
      最近更新 更多