通过嵌套json中的值提取第一个键

时间:2019-01-09 15:02:09

标签: python json python-3.x

我有一个json格式,我必须从中首次提取key:value。通过了几个示例,但出错了。

{
     "search-results": {
     "entry": [
        {
            "@_fa": "true",
            "eid": "10-s2.0-60103485",
            "prism:url": 
"https://api.elsevier.com/content/affiliation/affiliation_id/60103485"
        },
        {
            "@_fa": "true",
            "eid": "10-s2.0-113310784",
            "prism:url": 
"https://api.elsevier.com/content/affiliation/affiliation_id/113310784"
        },

我尝试过:

myvar = results['search-results'][0]['entry']['eid']
print (myvar)

TypeError: string indices must be integers


results = json.dumps(resp.json(),
             sort_keys=True,
             indent=4, separators=(',', ': '))


print(results)
myvar = results['search-results'][0]['entry']['eid']
print (myvar)  

我需要在"eid": "10-s2.0-60103485"首次出现时提取它。

3 个答案:

答案 0 :(得分:2)

您只需要翻转BOOT-INF/classes/oauth_configuration.properties['entry']的位置即可。

[0]

答案 1 :(得分:1)

关于这一点,您的问题不是很清楚,但是如果这样:

results = json.dumps(resp.json(),
             sort_keys=True,
             indent=4, separators=(',', ': '))


print(results)
myvar = results['search-results'][0]['entry']['eid']
print (myvar)  

是引发TypeError的代码,那么,很显然,这就是人们所期望的。 json.dumps(obj, ...)接受一个Python对象并将其序列化为json字符串,因此在您的代码中results是一个字符串(它包含json格式的内容是完全无关的)。要将json字符串反序列化为Python(这样您就可以使用一个python对象),则需要json.loads(somejsonstr)

现在,实际上resp.json()(我假设resp来自python-requests库)已经负责将其内容反序列化为Python,因此您无需再进行其他操作了。可以-当然,除了以正确的顺序获取dict键/列表索引外,正如James_F所述:

resp = requests.get(someurl)
results = resp.json()
myvar = results['search-results']['entry'][0]['eid']
print(myvar)

答案 2 :(得分:0)

尝试使用jsonpath_ng.ext。

from jsonpath_ng.ext import parse

f = parse("$..entry[?(@.eid=='10-s2.0-60103485')]").find(data)
print(f[0].value)

这将输出{'@_fa': 'true', 'eid': '10-s2.0-60103485', 'prism:url': 'https://api.elsevier.com/content/affiliation/affiliation_id/60103485'}