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

使用python重命名嵌套json中的数字键,python,json,Python,Json,我试图重命名json数据的键,这样,如果键中只有数字,那么应该用常量字符串填充它 input_json = {'key1': {'2': 'value2', 'key3': {'key4': 'value4', '5': 'value5'}}} output_json = {'key1': {'key2': 'value2', 'key3': {'key4': 'value4', 'key5': 'value5'}}} 这就是我一直在尝试但没有成功的地方: def format_json_k

我试图重命名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))

有更好的方法来实现这一点吗?

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

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

您需要将列表理解的结果分配给某些内容。您正在修改原始的dict,而不是对新的dict进行任何操作。谢谢。这会使函数更通用。