Python将包含嵌套json的字符串转换为dict

标签 python

我有以下列表(注意“keyE”有一个字典作为字符串):

[
  {
    "keyA": "Example",
    "keyB": "{\"keyC\":2,\"keyD\":{\"keyE\":\"{\"name\":\"foo\"}\"},\"keyF\":0}"
  },
  {
    "keyA": "Example2",
    "keyB": "{\"keyC\":6,\"keyD\":{\"keyE\":\"{\"name\":\"bar\"}\"},\"keyF\":5}"
  }
]

我想将其转换为这个(它可以有任意数量的嵌套字典和列表):

[
  {
    "keyA": "Example",
    "keyB": {
      "keyC": 2,
      "keyD": {
        "keyE": {
          "name": "foo"
        }
      },
      "keyF": 0
    }
  },
  {
    "keyA": "Example2",
    "keyB": {
      "keyC": 6,
      "keyD": {
        "keyE": {
          "name": "bar"
        }
      },
      "keyF": 5
    }
  }
]

到目前为止,我有以下内容,但我不知道在 json.loads 之后要做什么。我知道我必须递归调用该函数,但不知道如何调用。

import json

def convert(data_list: list) -> list:
  for i in range(len(data_list)):
    obj = data_list[i]

    for key, value in obj.items():
      if isinstance(value, str) and any(char in "{[]}" for char in value):
        try:
          data = json.loads(value)
          # What do I do here?
        except:
          continue

最佳答案

不知道这是否适用于您更复杂的情况,但我能够使用 ast.literal_eval() 和一些非常糟糕的链接 str.replace 调用:

import ast


def replace(s):
    return ast.literal_eval(s.replace(r'"{', "{").replace(r'}"', "}"))


x = [{"keyA": "Example",
      "keyB": "{\"keyC\":2,\"keyD\":{\"keyE\":\"{\"name\":\"foo\"}\"},\"keyF\":0}"},
     {"keyA": "Example2",
      "keyB": "{\"keyC\":6,\"keyD\":{\"keyE\":\"{\"name\":\"bar\"}\"},\"keyF\":5}"}]


for d in x:
    for key, value in d.items():
        if "{" in value:
            d[key] = replace(value)

输出:

In [4]: x
Out[4]:
[{'keyA': 'Example',
  'keyB': {'keyC': 2, 'keyD': {'keyE': {'name': 'foo'}}, 'keyF': 0}},
 {'keyA': 'Example2',
  'keyB': {'keyC': 6, 'keyD': {'keyE': {'name': 'bar'}}, 'keyF': 5}}]

In [5]: x[0]["keyB"]["keyD"]["keyE"]["name"]
Out[5]: 'foo'

关于Python将包含嵌套json的字符串转换为dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71059822/

相关文章:

Python 编解码器行结尾

python - Bloomberg API SDK 与 Anaconda Python 不兼容

python - 删除数组中重复的列,保持顺序

python - 如何通过 __reduce__ 实现代码执行来进行 pickle?

python - insertmany 到内存中的 sqlite 数据库 - SQLite Date 类型仅接受 Python 日期对象作为输入

python - 使用 Mechanize 浏览器python查找静态字段的动态文本值

python - Python中车辆位置估计的卡尔曼滤波器参数定义

python - 如何从 Pandas DataFrame 中提取和求和唯一单词

python - PTVS 未检测到已安装的 VS2010

python - 如何从 3d 张量向每个 2d 张量添加 2d 张量