繁体   English   中英

使用python重命名嵌套json中的数字键

[英]Renaming numeric keys in nested json using python

我正在尝试重命名 json 数据的键,这样如果键中只有数字,那么它应该用常量字符串填充。

input_json = {'key1': {'2': 'value2', 'key3': {'key4': 'value4', '5': 'value5'}}}

output_json = {'key1': {'key2': 'value2', 'key3': {'key4': 'value4', 'key5': 'value5'}}}

这是我正在尝试但没有奏效的:

def format_json_keys(d):
    new = {}
    for k, v in d.items():
        if isinstance(v, dict):
            if k.isdecimal():
                d["key" + str(k)] = v
            format_json_keys(v)
        if isinstance(v, list):
            [format_json_keys(row) for row in v]
    return new
print(format_json_keys(input_json))

有没有更好的方法来实现这一目标?

您没有将更新的元素放在new ,而是在修改原始字典。 无论值的类型如何,您都应该替换键。 值类型只是控制我们如何递归。

def format_json_keys(d):
    new = {}
    for k, v in d.items():
        newkey = "key" + str(k) if k.isdecimal() else k
        if isinstance(v, dict):
            new[newkey] = format_json_keys(v)
        elif isinstance(v, list):
            new[newkey] = [format_json_keys(row) for row in v]
        else:
            new[newkey] = v
    return new

请试试这个?

    def solve ( d ) :
        for k,v  in d.items() :
            if k.isdecimal ( ) :
                d["key" + k ] = v 
                d .pop ( k ) 
                
            if type (v ) == dict :
                solve ( v )
                break 
        return d

无条件调用输入对象的items方法这一事实意味着输入对象必须是一个 dict,并且该函数仅接受一个列表,如果它是第一级给定 dict 的值。

在继续不同的递归逻辑之前,您可以通过使用if语句首先确定输入对象的数据类型来使函数更通用:

def format_json_keys(d):
    if isinstance(d, dict):
        return {'key' + k if k.isdecimal() else k: format_json_keys(v) for k, v in d.items()}
    elif isinstance(d, list):
        return list(map(format_json_keys, d))
    return d

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM