从嵌套的json文件加载重复的键作为lis字典

2024-10-16 17:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这种格式的json文件

{
  "details": {

    "hawk_branch": {
      "tandem": {
        "value": "4210bnd72"
      }
    },
    "uclif_branch": {
      "tandem": {
        "value": "e2nc712nma89",
        "value": "23s24212",
        "value": "12338cm82",
      }
    }
    }
}

问题是,我需要保留所有value,但是当我使用json.load来加载这个文件时,我只得到一个value,这很有意义,因为dict只能保持唯一keys。在

这是预期产量

^{pr2}$

我读过这个答案,Python json parser allow duplicate keys像这样使用object_pairs_hook

def parse_object_pairs(pairs):
    return pairs

# f is file
json.load(f, object_pairs_hook=parse_object_pairs)

但它以list的形式返回整个json文件。在

我认为用lambda作为object_pairs_hook是有可能的,但是我不明白如何使用它。在

有人能引导我吗


Tags: 文件branchjsonobjectparsevalue格式load
1条回答
网友
1楼 · 发布于 2024-10-16 17:27:59

您可以使用自定义的重复键解析器函数,该函数将value键的值转换为列表:

def value_resolver(pairs):
    if all(k == 'value' for k, _ in pairs):
        return [v for _, v in pairs]
    return dict(pairs)

因此:

^{pr2}$

退货:

{'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}

要通过将列表转换为具有重复的value键的dict,将新的数据结构转储回原始的JSON格式,可以使用自定义的json.JSONEncoder子类:

class restore_value(json.JSONEncoder):
    def encode(self, o):
        if isinstance(o, dict):
            return '{%s}' % ', '.join(': '.join((json.encoder.py_encode_basestring(k), self.encode(v))) for k, v in o.items())
        if isinstance(o, list):
            return '{%s}' % ', '.join('"value": %s' % self.encode(v) for v in o)
        return super().encode(o)

因此:

d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}
print(json.dumps(d, cls=restore_value))

将输出:

{"details": {"hawk_branch": {"tandem": {"value": "4210bnd72"}}, "uclif_branch": {"tandem": {"value": "e2nc712nma89", "value": "23s24212", "value": "12338cm82"}}}}

相关问题 更多 >