如何修改json文件中的value值并保存至文件?

问题:#

  • 在原 json 文件的基础上仅针对所有 value 值进行替换并保存文件(PS:value 值中存在的字符类型有:int,bool,str,float。这里仅仅针对 str 字符类型进行替换,其他类型跳过不做处理。)

json 范例:#

{
        "squadName" : "SUPER HERO SQUAD",
        "homeTown" : "METRO CITY",
        "formed" : 2016,
        "secretBase" : "SUPER TOWER",
        "active" : true,
        "members" : [
            {
                "name" : "MOLECULE MAN",
                "age" : 29.3,
                "secretIdentity" : "DAN JUKES",
                "powers" : [
                    "RADIATION RESISTANCE",
                    "TURNING TINY",
                    "RADIATION BLAST"
                ]
            },
            {
                "name" : "MADAME UPPERCUT",
                "age" : 39,
                "secretIdentity" : "JANE WILSON",
                "powers" : [
                    "MILLION TONNE PUNCH",
                    "DAMAGE RESISTANCE",
                    "SUPERHUMAN REFLEXES"
                ]
            },
            {
                "name" : "ETERNAL FLAME",
                "age" : 1000000,
                "secretIdentity" : "UNKNOWN",
                "powers" : [
                    "IMMORTALITY",
                    "HEAT IMMUNITY",
                    "INFERNO",
                    "TELEPORTATION",
                    "INTERDIMENSIONAL TRAVEL"
                ]
            }
        ]
    }

Code:#

代码已被折叠,点此展开

输出:#

代码已被折叠,点此展开

遇到的问题:#

  • 字符串类型转换和进行 io 读写报错
  • 拿到的 json 数据不能直接使用 replace () 方法
讨论数量: 9
Jason990420

这是使用 isinstance 函数,以及递归的方式

def translate(string):
    return string.lower()

def convert(var):
    if isinstance(var, dict):
        return {key:convert(value) for key, value in var.items()}
    elif isinstance(var, list):
        return [convert(item) for item in var]
    elif isinstance(var, tuple):
        return (convert(item) for item in var)
    elif isinstance(var, str):
        return translate(var)
    else:
        return var

var = json.loads(json_txt)
new_var = convert(var)

with open(filename, 'wt') as f:
    json.dump(var, f, ensure_ascii=False)

注:如果 ensure_ascii 为 False,那么写入 fp 的字符串可以包含非 ASCII 字符;否则,所有此类字符都会在 JSON 字符串中转义。(缺省为 True)

>>> new_var
{'active': True,
 'formed': 2016,
 'homeTown': 'metro city',
 'members': [{'age': 29.3,
              'name': 'molecule man',
              'powers': ['radiation resistance',
                         'turning tiny',
                         'radiation blast'],
              'secretIdentity': 'dan jukes'},
             {'age': 39,
              'name': 'madame uppercut',
              'powers': ['million tonne punch',
                         'damage resistance',
                         'superhuman reflexes'],
              'secretIdentity': 'jane wilson'},
             {'age': 1000000,
              'name': 'eternal flame',
              'powers': ['immortality',
                         'heat immunity',
                         'inferno',
                         'teleportation',
                         'interdimensional travel'],
              'secretIdentity': 'unknown'}],
 'secretBase': 'super tower',
 'squadName': 'super hero squad'}
3年前 评论
Scrooge (楼主) 3年前
Jason990420 (作者) 3年前
Scrooge (楼主) 3年前
Scrooge (楼主) 3年前
Jason990420 (作者) 3年前
Scrooge (楼主) 3年前
Jason990420 (作者) 3年前
Jason990420

没任何回应,也没打钩?这个问题解决了吗?

3年前 评论