忽略JSON键值对的条件检查

时间:2017-03-03 21:08:55

标签: python json geojson

我正在从返回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响应中的某些行有它,有些行不是

2 个答案:

答案 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,而不是stringbool,{{1}等等。)

我也相信你的json对象是用python字典实现的,所以你可以检查某些字段,例如使用None存在'geometry',它将返回其值或x.get('geometry')对象。您还可以使用None设置默认值(city = x.get('city', 'UKN')json objectstringbool等),如果在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')