【问题标题】:JSON data formatting using Python使用 Python 格式化 JSON 数据
【发布时间】:2021-08-07 07:29:27
【问题描述】:

我正在尝试使用 python 更改 JSON 格式。接收到的消息有一些键值对,在转发消息前需要更改某些键名。 对于普通的键值对,我使用了 "data.pop" 方法 data["newkey"]=data.pop("oldkey") 。 但是嵌套键值会使它变得复杂。这只是需要转换的大文件的一部分。 如何转换这个

{
"atrk1": "form_varient",
    "atrv1": "red_top",
    "atrt1": "string",
      "atrk2": "ref",
    "atrv2": "XPOWJRICW993LKJD",
    "atrt2": "string"
}

喜欢这个吗?

"attributes": {
        "form_varient": {
            "value": "red_top",
            "type": "string"
        },
        "ref": {
            "value": "XPOWJRICW993LKJD",
            "type": "string"
        }
    }

【问题讨论】:

    标签: python json dictionary format key


    【解决方案1】:

    如果密钥格式相同,您可以这样做。

     d = {
        "ev": "contact_form_submitted",
        "et": "form_submit",
        "id": "cl_app_id_001",
        "uid": "cl_app_id_001-uid-001",
        "mid": "cl_app_id_001-uid-001",
        "t": "Vegefoods - Free Bootstrap 4 Template by Colorlib",
        "p": "http://shielded-eyrie-45679.herokuapp.com/contact-us",
        "l": "en-US",
        "sc": "1920 x 1080",
        "atrk1": "form_varient",
        "atrv1": "red_top",
        "atrt1": "string",
          "atrk2": "ref",
        "atrv2": "XPOWJRICW993LKJD",
        "atrt2": "string",
          "uatrk1": "name",
        "uatrv1": "iron man",
        "uatrt1": "string",
          "uatrk2": "email",
        "uatrv2": "ironman@avengers.com",
        "uatrt2": "string",
          "uatrk3": "age",
        "uatrv3": "32",
        "uatrt3": "integer"
    }
        
    d["attributes"] = {}
    d["traits"] = {}
    keys_to_remove = []
    for k in d.keys():
        if k.startswith("atrk"):
            value_key = k.replace("atrk","atrv")
            type_key = k.replace("atrk","atrt")
            d["attributes"][d[k]] = {"value":d[value_key],"type":d[type_key]}
            keys_to_remove += [value_key,k,type_key]
        if k.startswith("uatrk"):
            keys_to_remove.append(k)
            value_key = k.replace("uatrk","uatrv")
            type_key = k.replace("uatrk","uatrt")
            d["traits"][d[k]] = {"value":d[value_key],"type":d[type_key]}
            keys_to_remove += [value_key,k,type_key]
    
    for k in keys_to_remove:
        if k in d:
            del d[k]
    

    【讨论】:

    • 嗨,正如我所说,这是一个更大的 JSON 文件的一部分。您的方法正在产生结果,但是它正在创建额外的键值对并且旧的仍然保留在文件中。 @罗宾
    • 如果您不想要旧数据。用新结果重播文件内容怎么样?
    • 我已经更新了代码。但现在看来我硬编码了很多。我不知道完整的数据集。如果此代码不起作用,请告诉我。
    • 您好,我已将键转换为列表,然后使用 del 方法删除不需要的项目。感谢您提供上述解决方案。 @罗宾
    • 您以前的解决方案对我来说效果很好。正如我所说,我将它与删除方法结合使用。你能把你的解决方案改回以前的解决方案吗?我认为如果我们处理动态变化会更有效。
    【解决方案2】:

    使用下面的代码就可以成功转换了。

    json1={
    "atrk1": "form_varient",
        "atrv1": "red_top",
        "atrt1": "string",
          "atrk2": "ref",
        "atrv2": "XPOWJRICW993LKJD",
        "atrt2": "string"
    }
    json2={}
    keys=[]
    values=[]
    types=[]
    for i in json1:
        if i[:4]=='atrk':
            keys.append(json1[i])
            values.append([])
            types.append([])
        elif i[:4]=='atrv':
            values[int(i[-1:])-1].append(json1[i])
        elif i[:4]=='atrt':
            types[int(i[-1:])-1].append(json1[i])
    
    for i in range(len(keys)):
        json2[keys[i]]={
            'value':values[i],'type':types[i]
        }
    
    json3={}
    json3['attributes']=json2
    print(json3)
    

    【讨论】:

    • 不幸的是,我不能将其用作名称前缀为“atrk”的键动态更改。
    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 2012-10-23
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多