JSON 使用 Python 进行数据格式化
JSON data formatting using Python
我正在尝试使用 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"
}
}
如果密钥的格式相同,您可以这样做。
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]
使用下面的代码就可以成功转换了。
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)
我正在尝试使用 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"
}
}
如果密钥的格式相同,您可以这样做。
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]
使用下面的代码就可以成功转换了。
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)