在 Python 中解决 JSON null 值

Working around JSON null values in Python

提问人:Carl Huxohl 提问时间:8/9/2023 更新时间:8/9/2023 访问量:26

问:

我有一个json文件,其中null表示没有值。当我查找的第一个值被发现为 null 时,我正在尝试从另一个字段读取。但就我而言,我无法弄清楚实现目标的语法。

>import json
>import urllib.request,urllib.parse,urllib.error        
>f h=urllib.request.urlopen('http://mrdata.usgs.gov/geology/state/json/IAXs;0')
>info=json.load(fh)
>if info['age'][0][min_epoch'] == None:
>    GEO_AGE = info['age'][0]['cmax_age']
>else:
>    GEO_AGE = info['age'][0]['min_epoch']
>print('AGE: ', GEO_AGE)

打印结果时,结果是: AGE: 古元古代

这个结果是正确的,但出于某种原因,我无法解释...... 当“min_epoch”为空或空时,“cmax_age”字符串确实是“古元古代”

但是,当我替换以下内容时: fh = urllib.request.urlopen('http://mrdata.usgs.gov/geology/state/json/IACAe;0'

结果是相同的 AGE:古元古代

实际上,输出应该是 AGE: Middle-Cambrian

`

json python-3.x

评论


答:

0赞 diyImma 8/9/2023 #1

当我按照您所说的运行代码时,我得到了预期的结果:

import json
import urllib.request,urllib.parse,urllib.error
fh=urllib.request.urlopen('http://mrdata.usgs.gov/geology/state/json/IACAe;0')
info=json.load(fh)
if info['age'][0]['min_epoch'] == None:
    GEO_AGE = info['age'][0]['cmax_age']
else:
    GEO_AGE = info['age'][0]['min_epoch']
print('AGE: ', GEO_AGE)

年龄:中寒武纪

0赞 Ramasubramanian M 8/9/2023 #2

我没有看到您的代码有任何问题,并且可以正常工作。请参考以下内容:

import json
import urllib.request,urllib.parse,urllib.error    

fh=urllib.request.urlopen('http://mrdata.usgs.gov/geology/state/json/IAXs;0')
info=json.load(fh)
if info['age'][0]['min_epoch'] == None:
    GEO_AGE = 2 or info['age'][0]['cmax_age']
else:
    GEO_AGE = 1 or info['age'][0]['min_epoch']
print('AGE: ', GEO_AGE)

这是另一个使用“or”的简化版本:

import json
import urllib.request,urllib.parse,urllib.error    

def print_geo_age(url):
    fh=urllib.request.urlopen(url)
    info=json.load(fh)
    GEO_AGE = info['age'][0]['min_epoch'] or info['age'][0]['cmax_age']
    print('AGE: ', GEO_AGE)

if __name__ == "__main__":
    print_geo_age('http://mrdata.usgs.gov/geology/state/json/IAXs;0')
    print_geo_age('http://mrdata.usgs.gov/geology/state/json/IACAe;0')