【问题标题】:JSON traversal and editing in pythonpython中的JSON遍历和编辑
【发布时间】:2021-12-08 08:01:01
【问题描述】:

我有一些如下所示的 JSON 响应

{
    "response": {
        "list": [
            {
                "key1": "val1",
                "key2": "val2"
            },
            {
                "key3": "val3",
                "key4": ""
            }
        ],
        "data": {
            "key5": "val5",
            "key6": "",
            "key7": "val7"
        },
        "key8": "val8",
        "key9": "val9",
        "key10": "",
        "key10": "val10"
    }
}

某些 JSON 响应可能是完全不同的结构。有些可能有更多的内部列表和字典,有些可能是一个简单的平面 json 我需要用 Null/None 值替换所有空字符串 ("")。 我不确定如何在替换值时遍历未知的 JSON。

任何帮助将不胜感激

【问题讨论】:

  • 你不会改变 json。使用 json.loads 将其加载到 python 数据结构中,在那里进行更改,然后覆盖整个 json 文件。这是中间步骤的类似内容:stackoverflow.com/questions/42095393/…
  • 使用jq,可以简单地编写类似jq 'walk(select(.=="")|=null)' tmp.json 的内容。存在Python bindings for the jq library 可以让你做类似的事情。

标签: python json dictionary


【解决方案1】:

最简单的解决方案是使用Python jq bindings,它允许您在解码之前编写一个简短的过滤器来处理 JSON。

response = '''{
    "response": {
        "list": [
            {
                "key1": "val1",
                "key2": "val2"
            },
            {
                "key3": "val3",
                "key4": ""
            }
        ],
        "data": {
            "key5": "val5",
            "key6": "",
            "key7": "val7"
        },
        "key8": "val8",
        "key9": "val9",
        "key10": "",
        "key10": "val10"
    }
}'''

>>> jq.all('walk(select(.=="")|=null)', text=response)[0]
{'response': {'list': [{'key1': 'val1', 'key2': 'val2'}, {'key3': 'val3', 'key4': None}], 'data': {'key5': 'val5', 'key6': None, 'key7': 'val7'}, 'key8': 'val8', 'key9': 'val9', 'key10': 'val10'}}

【讨论】:

    【解决方案2】:

    没有库的最简单方法是创建和使用递归函数:

    def replace_blanks(o):
        if isinstance(o, dict):
            return {k: replace_blanks(v) for k, v in o.items()}
        if isinstance(o, list):
            return [replace_blanks(elem) for elem in o]
        return None if o == '' else o
    

    用法:

    from pprint import pprint
    
    
    d = {
        "response": {
            "list": [
                {
                    "key1": "val1",
                    "key2": "val2"
                },
                {
                    "key3": "val3",
                    "key4": ""
                }
            ],
            "data": {
                "key5": "val5",
                "key6": "",
                "key7": "val7"
            },
            "key8": "val8",
            "key9": "val9",
            "key10": "",
            "key10": "val10"
        }
    }
    
    pprint(replace_blanks(d))
    

    打印:

    {'response': {'data': {'key5': 'val5', 'key6': None, 'key7': 'val7'},
                  'key10': 'val10',
                  'key8': 'val8',
                  'key9': 'val9',
                  'list': [{'key1': 'val1', 'key2': 'val2'},
                           {'key3': 'val3', 'key4': None}]}}
    

    如果您的数据是 JSON 字符串并且您尝试将其加载到 Python 对象,您还可以将 object_hook 参数传递给 json.loads

    json_string = """
    {"response": {"list": [{"key1": "val1", "key2": "val2"}, {"key3": "val3", "key4": ""}],
                  "data": {"key5": "val5", "key6": "", "key7": "val7"},
                  "key8": "val8", "key9": "val9", "key10": "val10"}}
    """
    
    data = json.loads(json_string, object_hook=replace_blanks)
    pprint(data)
    

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2018-06-19
      • 2017-02-23
      • 2012-06-07
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多