我正在从返回JSON的Web调用构建一个点要素类。 JSON有点粗略,因为有时键不存在于记录中。我有一个有效的JSON对象,我试图这样做:
#requests stuff above this
for i in jsonObj:
try:
if i['properties']['country']:
country = i['properties']['country']
else:
country = 'UNK'
print('Country name not found, using {}'.format(country))
except KeyError, e:
print('Key error: reason: {}'.format(str(e)))
pass
#then do all the arcpy FC creation stuff
结果是一大堆关键错误"原因:' country'"而不是使用通用的“国家/地区”来构建这些行。 &UNK'的价值,它将简单地忽略它们并构建要素类,而忽略这些点。
我已取出try
并将其作为条件检查,但在第一行没有“国家/地区”的情况下失败了。键。
总之,我只是想检查一个键值对是否存在;如果没有,请将'UNK'
的通用值分配给country
变量。
似乎问题的一部分可能是if i['properties']['countries']
正在检查值,而不是密钥本身的存在?我怎样才能更有效地检查钥匙的存在?
我已阅读Check if a given key already exists in a dictionary并已将我的代码修改为这两个代码,并且都没有产生预期的结果:
for i in jsonObj:
try:
# get coordinates first
if i['geometry']['coordinates']:
ycoord = float(i['geometry']['coordinates'][1])
xcoord = float(i['geometry']['coordinates'][0])
if i['properties']['city'] in i:
city = i['properties']['city']
else:
city = 'UNK'
if i['properties']['country'] in i:
country = i['properties']['country']
else:
country = 'UNK'
和
for i in jsonObj:
try:
# get coordinates first
if i['geometry']['coordinates']:
ycoord = float(i['geometry']['coordinates'][1])
xcoord = float(i['geometry']['coordinates'][0])
if 'city' in i:
city = i['properties']['city']
else:
city = 'UNK'
if 'country' in i:
country = i['properties']['country']
else:
country = 'UNK'
我确实拥有'属性'键入每个记录/词典,但我是否有一个'国家'密钥不保证。 json响应中的某些行有它,有些行不是
答案 0 :(得分:2)
你的最后一次尝试:
if 'country' in i:
country = i['properties']['country']
else:
country = 'UNK'
很接近,但是你正在管理一个dicts的词典,'country'
有更好的机会成为sub-dict的关键,所以修复将是:
if 'country' in i['properties']:
country = i['properties']['country']
else:
country = 'UNK'
甚至更好&使用get
使用默认值更短(我建议使用quickfix上的最后一个):
country = i['properties'].get('country','UNK')
答案 1 :(得分:0)
您似乎并不完全了解json的实现。
x = i['geometry']['coordinates']
基本上是y = i['geometry']; x = y['coordinates']
,因此您需要对每个图层进行安全检查,因为i['geometry']
不仅会在找不到'geometry'
字段时抛出异常,而且还会返回对象还必须实现[]
['coordinates']
才能工作(因此在这种情况下,它必须是另一个json object
,而不是string
,bool
,{{1}等等。)
我也相信你的json对象是用python字典实现的,所以你可以检查某些字段,例如使用None
存在'geometry'
,它将返回其值或x.get('geometry')
对象。您还可以使用None
设置默认值(city = x.get('city', 'UKN')
,json object
,string
,bool
等),如果在dict中找不到它(python { {1}}方法实现默认处理程序。)
所以最后你应该有这样的东西:
None
这是一个草稿,我没有测试它,也强烈断言你的dict.get
基于python geo = i.get('geometry')
if not geo: return
coords = geo.get('coordinates')
if not coords: return
xcoord, ycoord = float(coords[0]), float(coords[1])
props = i.get('properties')
if not props: return
city = props.get('city', 'UNK')
country = props.get('country', 'UNK')
。