我需要递归地遍历 JSON 文件(从 API 发布响应),提取以 ["text"] 作为键的字符串{"text":"this is a string"}
我需要开始从元数据中具有最旧日期的源进行解析,从该源中提取字符串,然后移至第二个最旧的源,依此类推。 JSON 文件可能会严重嵌套,并且字符串所在的级别可能会不时发生变化。
问题:
有很多名为 ["text"] 的键,我不需要所有这些键,我只需要那些具有字符串值的键。更好的是,我需要的 "text":"string" 始终位于 a 的同一个对象 {} 中"type":"sentence"
。参见图片。
我在问什么
修改下面的第二个代码,以便递归地遍历文件并仅提取 ["text"] 值(当它们与 "type":"sentence" 位于同一对象 {} 中时)。
下面是 JSON 文件的片段(绿色的是我需要的文本和元数据,红色的是我不需要提取的文本):
![screenshot of contents of JSON file](https://i.stack.imgur.com/SyOsJ.png)
完整 JSON 示例的链接:http://pastebin.com/0NS5BiDk
到目前为止我所做的:
1)简单的方法:将json文件转换为字符串并搜索双引号(“”)之间的内容,因为在所有json帖子响应中,我需要的“字符串”是唯一位于双引号之间的内容。然而,这个选项阻止我预先订购资源,因此还不够好。
r1 = s.post(url2, data=payload1)
j = str(r1.json())
sentences_list = (re.findall(r'\"(.+?)\"', j))
numentries = 0
for sentences in sentences_list:
numentries += 1
print(sentences)
print(numentries)
2) 更聪明的方法:递归地遍历 JSON 文件并提取 ["text"] 值
def get_all(myjson, key):
if type(myjson) is dict:
for jsonkey in (myjson):
if type(myjson[jsonkey]) in (list, dict):
get_all(myjson[jsonkey], key)
elif jsonkey == key:
print (myjson[jsonkey])
elif type(myjson) is list:
for item in myjson:
if type(item) in (list, dict):
get_all(item, key)
print(get_all(r1.json(), "text"))
它提取所有以 ["text"] 作为键的值。不幸的是,在文件中还有其他内容(我不需要)以 [“text”] 作为键。因此它返回我不需要的文本。
请指教。
UPDATE
我编写了 2 个代码来按某个键对对象列表进行排序。第一个按 xml 的“文本”排序。第二个由“包含期间”值组成。
第一个有效,但是一些 XML,即使它们的数量较多,实际上里面的文档比我预期的要早。
对于第二个代码,“包含周期”的格式不一致,有时该值根本不存在。第二个也给了我一个错误,但我不明白为什么 -string indices must be integers
.
# 1st code (it works but not ideal)
j=r1.json()
list = []
for row in j["tree"]["children"][0]["children"]:
list.append(row)
newlist = sorted(list, key=lambda k: k['text'][-9:])
print(newlist)
# 2nd code I need something to expect missing values and to solve the
# list index error
list = []
for row in j["tree"]["children"][0]["children"]:
list.append(row)
def date(key):
return dparser.parse((' '.join(key.split(' ')[-3:])),fuzzy=True)
def order(list_to_order):
try:
return sorted(list_to_order,
key=lambda k: k[date(["metadata"][0]["value"])])
except ValueError:
return 0
print(order(list))