我有一個平面 JSON,其中鍵代表不同的級別。
例如:
data = {
"name": "John",
"age": 30,
"address:city": "New-York",
"address:street": "5th avenue",
"address:number": 10,
}
如您所見,鍵包含:哪個是級別的分隔符。
我想把它轉換成這樣的:
wanted = {
"name": "John",
"age": 30,
"address": {
"city": "New-York",
"street": "5th avenue",
"number": 10
}
}
我正在使用 Python,但在這里我更多的是尋找邏輯建議,以通用方式解決此問題的最佳方法是什么(僅針對此特定示例)
謝謝你的幫助
uj5u.com熱心網友回復:
一種支持多層嵌套的遞回方法。
from typing import Any
def build(key: list[str], value: Any, res: dict):
k, *r = key
if r:
if not res.get(k):
res[k] = {}
build(r, value, res[k])
else:
res[k] = value
res = {}
for k, v in data.items():
build(k.split(":"), v, res)
uj5u.com熱心網友回復:
我認為一種簡單的方法是創建一個將此 JSON 映射到一個物件的方法,然后將該物件轉換為另一個具有“想要”屬性的物件,然后您可以簡單地將結果物件轉換為 JSON將有“想要”的結構
uj5u.com熱心網友回復:
在 Python 中:
def convert(inp, sep=':'):
output = {}
for key, value in inp.items():
*path, skey = key.split(sep)
dest = output
for p in path:
if p not in dest:
dest[p] = dict()
dest = dest[p]
dest[skey] = value
return output
uj5u.com熱心網友回復:
您可以使用jq:
jq 'reduce to_entries[] as {$key, $value} ({}; setpath($key / ":"; $value))'
輸出
{
"name": "John",
"age": 30,
"address": {
"city": "New-York",
"street": "5th avenue",
"number": 10
}
}
如果要對鍵進行排序:
jq '. as $obj
| reduce keys[] as $key ({}; . * setpath($key | split(":"); $obj[$key]))'
輸出
{
"address": {
"city": "New-York",
"number": 10,
"street": "5th avenue"
},
"age": 30,
"name": "John"
}
該代碼適用于多個嵌套級別(例如附加條目"contact:phone:work": "110")
uj5u.com熱心網友回復:
# Data input
data = {
"name": "John",
"age": 30,
"address:city": "New-York",
"address:street": "5th avenue",
"address:number": 10,
}
# Initiate output
output = {
}
# Get keys in data
keys = data.keys()
# Iterate through keys
for i in keys:
# If there is a seperator, make sub-dcitionary. If not then proceed to add data normally.
if ":" in i:
# Extract subdictionary title and element name
split = i.split(":")
# If the subdictionary doesn't already exist, create it
if not (split[0] in output.keys()):
output[split[0]] = {}
# Add element to subdictionary
output[split[0]][split[1]]=data[i]
else:
output[i]=data[i]
# Print out results
print(output)
結果
{'name': 'John', 'age': 30, 'address': {'city': 'New-York', 'street': '5th avenue', 'number': 10}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532373.html
標籤:Pythonjson算法
