获取 python 中的 json 路径列表
get list of json paths in python
我正在寻找 json 文件中所有可能的 json 路径的列表 - 可以推荐任何一个吗?
例如:如果输入低于
{
"_id":{
"$oid":""
},
"aa":false,
"bb":false,
"source":"",
"email":"",
"createdAt":{
"$date":""
},
"updatedAt":{
"$date":""
},
"cc":"",
"vv":"",
"metadata":{
"vv":"",
"xx":[{}]
}
}
o/p :
obj
obj._id
obj._id.$oid
obj.aa
obj.bb
obj.source
obj.email
obj.createdAt
obj.createdAt.$date
obj.updatedAt
obj.updatedAt.$date
obj.cc
obj.vv
obj.metadata
obj.metadata.vv
obj.metadata.xx
obj.metadata.xx[0]
我基本上是在看。 python 版本:https://www.convertjson.com/json-path-list.htm
我想构建一个通用解决方案,如果有任何 json 文件 - 它将是模式生成的单个值(即换行符分隔的一行 json)
有什么建议吗?
您可以使用递归生成器以相当简洁的方式执行此操作。字符串 "obj"
有点尴尬,因为它没有出现在数据结构中。另一方面,在最后添加它很简单:
def get_paths(d):
if isinstance(d, dict):
for key, value in d.items():
yield f'.{key}'
yield from (f'.{key}{p}' for p in get_paths(value))
elif isinstance(d, list):
for i, value in enumerate(d):
yield f'[{i}]'
yield from (f'[{i}]{p}' for p in get_paths(value))
paths = ['obj'+s for s in get_paths(d)]
以字符串列表形式提供路径:
['obj._id',
'obj._id.$oid',
'obj.aa',
'obj.bb',
'obj.source',
'obj.email',
'obj.createdAt',
'obj.createdAt.$date',
'obj.updatedAt',
'obj.updatedAt.$date',
'obj.cc',
'obj.vv',
'obj.metadata',
'obj.metadata.vv',
'obj.metadata.xx',
'obj.metadata.xx[0]']
当然,您可以将最后一步包装在函数中,例如并接受根对象字符串:
def get_paths(d, root="obj"):
def recur(d):
if isinstance(d, dict):
for key, value in d.items():
yield f'.{key}'
yield from (f'.{key}{p}' for p in get_paths(value))
elif isinstance(d, list):
for i, value in enumerate(d):
yield f'[{i}]'
yield from (f'[{i}]{p}' for p in get_paths(value))
return (root + p for p in recur(d))
list(get_paths(d))
# same result
您可以使用以下代码执行此操作:
mylist = []
def getKeys(obj, parent="obj"):
global mylist
for i in obj.keys():
mylist.append(parent+"."+i)
try:
getKeys(obj[i], parent+"."+i)
except AttributeError:
pass
getKeys({
"_id":{
"$oid":""
},
"aa":False,
"bb":False,
"source":"",
"email":"",
"createdAt":{
"$date":""
},
"updatedAt":{
"$date":""
},
"cc":"",
"vv":"",
"metadata":{
"vv":"",
"xx":[{}]
}
})
print(mylist)
我把false
改成了False
。如果您使用的是 JSON 而不是字典,您可能需要使用 JSON 库将其转换为字典。
import json
myDict = json.loads("{"_id":{"$oid":""},"aa":false,"bb":false,"source":"","email":"","createdAt":{"$date":""},"updatedAt":{"$date":""},"cc":"","vv":"","metadata":{"vv":"","xx":[{}]}}")
我正在寻找 json 文件中所有可能的 json 路径的列表 - 可以推荐任何一个吗?
例如:如果输入低于
{
"_id":{
"$oid":""
},
"aa":false,
"bb":false,
"source":"",
"email":"",
"createdAt":{
"$date":""
},
"updatedAt":{
"$date":""
},
"cc":"",
"vv":"",
"metadata":{
"vv":"",
"xx":[{}]
}
}
o/p :
obj
obj._id
obj._id.$oid
obj.aa
obj.bb
obj.source
obj.email
obj.createdAt
obj.createdAt.$date
obj.updatedAt
obj.updatedAt.$date
obj.cc
obj.vv
obj.metadata
obj.metadata.vv
obj.metadata.xx
obj.metadata.xx[0]
我基本上是在看。 python 版本:https://www.convertjson.com/json-path-list.htm
我想构建一个通用解决方案,如果有任何 json 文件 - 它将是模式生成的单个值(即换行符分隔的一行 json) 有什么建议吗?
您可以使用递归生成器以相当简洁的方式执行此操作。字符串 "obj"
有点尴尬,因为它没有出现在数据结构中。另一方面,在最后添加它很简单:
def get_paths(d):
if isinstance(d, dict):
for key, value in d.items():
yield f'.{key}'
yield from (f'.{key}{p}' for p in get_paths(value))
elif isinstance(d, list):
for i, value in enumerate(d):
yield f'[{i}]'
yield from (f'[{i}]{p}' for p in get_paths(value))
paths = ['obj'+s for s in get_paths(d)]
以字符串列表形式提供路径:
['obj._id',
'obj._id.$oid',
'obj.aa',
'obj.bb',
'obj.source',
'obj.email',
'obj.createdAt',
'obj.createdAt.$date',
'obj.updatedAt',
'obj.updatedAt.$date',
'obj.cc',
'obj.vv',
'obj.metadata',
'obj.metadata.vv',
'obj.metadata.xx',
'obj.metadata.xx[0]']
当然,您可以将最后一步包装在函数中,例如并接受根对象字符串:
def get_paths(d, root="obj"):
def recur(d):
if isinstance(d, dict):
for key, value in d.items():
yield f'.{key}'
yield from (f'.{key}{p}' for p in get_paths(value))
elif isinstance(d, list):
for i, value in enumerate(d):
yield f'[{i}]'
yield from (f'[{i}]{p}' for p in get_paths(value))
return (root + p for p in recur(d))
list(get_paths(d))
# same result
您可以使用以下代码执行此操作:
mylist = []
def getKeys(obj, parent="obj"):
global mylist
for i in obj.keys():
mylist.append(parent+"."+i)
try:
getKeys(obj[i], parent+"."+i)
except AttributeError:
pass
getKeys({
"_id":{
"$oid":""
},
"aa":False,
"bb":False,
"source":"",
"email":"",
"createdAt":{
"$date":""
},
"updatedAt":{
"$date":""
},
"cc":"",
"vv":"",
"metadata":{
"vv":"",
"xx":[{}]
}
})
print(mylist)
我把false
改成了False
。如果您使用的是 JSON 而不是字典,您可能需要使用 JSON 库将其转换为字典。
import json
myDict = json.loads("{"_id":{"$oid":""},"aa":false,"bb":false,"source":"","email":"","createdAt":{"$date":""},"updatedAt":{"$date":""},"cc":"","vv":"","metadata":{"vv":"","xx":[{}]}}")