【问题标题】:How to check if a value exists in JSON array and continue loop如何检查JSON数组中是否存在值并继续循环
【发布时间】:2019-01-31 16:10:21
【问题描述】:

所以我使用 for 循环来确定数组中是否存在特定键。但到目前为止,我尝试的每种方法都不适用于我想要完成的任务。

我的代码如下:

for i in range(1,len(opslag)):
     info_product = 'https://examplesite.com/'+str(opslag[i])+'.json'
     info_get = session.get(info_product)
     text_info_prdt = info_get.text
     json_info_prdt =json.loads(text_info_prdt)
     if json_info_prdt['product']['metafields']['meta_title_nl'] in json_info_prdt['product']['metafields']:
        print(json_info_prdt['product']['metafields']['meta_title_nl'])
     else:
         print(json_info_prdt['product']['id'])

所以在这种情况下 json_info_prdt['product']['metafields']['meta_title_nl'] 的值并不存在于我试图循环的每个数组中。所以有时 if else 语句会起作用,并且值会被打印出来。但有时json_info_prdt['product']['metafields']['meta_title_nl'] 的值根本不存在,给我一个KeyError

所以我想要做的是获取所有返回 KeyError 的产品的 ID,但我不希望循环停止而是继续直到它完成。所以我也不希望循环重新启动,因为那毫无意义。

我的 JSON 如下所示:

{
   product:{
      article_code:"",
      barcode:"",
      brand_id:null,
      created_at:"2017-07-07T12:49:23+02:00",
      data01:"",
      data02:"",
      data03:"",
      delivery_date_id:null,
      has_custom_fields:true,
      has_discounts:false,
      has_matrix:false,
      hits:0,
      hs_code:null,
      id:52847777,
      image_id:130661048,
      is_visible:true,
      price_excl:0,
      price_incl:0,
      price_old_excl:0,
      price_old_incl:0,
      product_set_id:383078,
      product_type_id:null,
      search_context:"",
      shop_id:240359,
      sku:"",
      supplier_id:null,
      updated_at:"2018-07-10T10:53:15+02:00",
      variants_count:4,
      visibility:"visible",
      weight:0,
      custom_fields:[

      ],
      variants:[

      ],
      product_relations:[

      ],
      product_categories:[

      ],
      product_discounts:[

      ],
      product_type:null,
      product_filter_values:[

      ],
      product_bundles:[

      ],
      metafields:{
         meta_title_nl:"Big House",
         meta_title_en:"cxzcxzcxz",
         meta_description_nl:"This is a big house"
      },
      supplier:null,
      product_images:[

      ],
      brand:null,
      delivery_date:null,
      image:{

      },
      nl:{

      },
      en:{

      },
      tags:null
   }
}

正如您所见,meta_title_nl 的值存在于这个值中,但有时它并不存在。

【问题讨论】:

    标签: python arrays json for-loop keyerror


    【解决方案1】:

    用于捕获错误的 if-else 结构称为 try-except。所以你应该使用:

    try:
        print(json_info_prdt['product']['metafields']['meta_title_nl'])
    except:
        print(json_info_prdt['product']['id'])
    

    【讨论】:

    • 不客气。顺便说一句,在字典的非嵌套情况下,通常会使用 get 方法,如果缺少 key,它提供了定义默认值的机会。但是,对于嵌套的 dicts,您可能需要先阅读此 stackoverflow.com/q/25833613/8300135
    【解决方案2】:

    如果有时可能不存在,您应该测试该键是否存在于字典中:

    变化:

    if json_info_prdt['product']['metafields']['meta_title_nl'] in json_info_prdt['product']['metafields']:
    

    到:

    if 'meta_title_nl' in json_info_prdt['product']['metafields']:
    

    【讨论】:

    • 该死,我比我想象的更接近,这工作谢谢!
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多