【问题标题】:Parsing Json extracting key value python解析Json提取键值python
【发布时间】:2020-10-06 10:40:21
【问题描述】:

大家好,我正在尝试在较长的 JSON 响应中提取相同的密钥但具有不同的值,但我不断收到:

KeyError: 'id'

不确定我做错了什么,但我正在使用 REST API 访问它: 这就是我的脚本:

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    for cid in rep:
        cid = rep["id"]
        print(cid)
countries()

响应比较长,但是是这样的,你会看到“id”,我需要相应的值:

{
    "items": [
        {
            "name": "Afghanistan",
            "displayName": "Afghanistan",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "AF",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/AF"
                }
            }
        },
        {
            "name": "Albania",
            "displayName": "Albania",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "AL",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/AL"
                }
            }
        },
        {
            "name": "Algeria",
            "displayName": "Algeria",
            "meta": {
                "type": "COUNTRY"
            },
            "id": "DZ",
            "links": {
                "self": {
                    "path": "/api/netim/v1/countries/DZ"
                }
            }
        },
        {
            "name": "American Samoa",
            "displayName": "American Samoa",
            "meta": {
                "type

【问题讨论】:

    标签: python json api rest


    【解决方案1】:

    响应不是数组,而是字典。 你想要那个字典的“items”元素:

    for cid in rep['items']:
    

    【讨论】:

      【解决方案2】:

      我稍微重写了你的函数,你现在应该能够从 JSON 响应中获取所有的 ID。我建议你研究一下 Python 中字典和列表的基础知识

      from requests.auth import HTTPBasicAuth
      import requests
      import json
      import urllib3
      
      urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
      
      def countries():
          data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
          rep = data.json()
          return [elem.get("id","") for elem in rep['items']]
      
      countries()
      

      更新: 如果您希望提取“path”键的值和“id”键的值,则需要一个字典列表,其中每个字典对应于 json 中的单个记录。

      修改后的功能如下:

      def countries():
          data = requests.get("https://10.24.21.4:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
          rep = data.json()
          return [{"id":elem.get("id",""),"path":elem["links"]["self"]["path"]} for elem in rep['items']]
      

      get() 返回一个默认值,以防字典中缺少该键。如果 idpath

      的 JSON 响应中未返回值,则新功能和以前的功能都不会失败

      如果您确定links 的值将始终可用,您可以直接使用上述函数,否则您将不得不编写一个自定义函数来解析键links 并返回一个空字符串,如果它是json 中为空

      【讨论】:

      • 您好,非常感谢,我自己不是程序员,只是在做一些工作。 QQ,我怎样才能得到关键的“路径”?道歉
      • 结果集中Path的ID和值是否都需要?
      • 我已经对答案进行了更改。请看一下
      • 嗨,非常感谢,这非常有帮助!我会听从你的建议,我会研究字典和列表的基础知识,再次感谢你!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2012-01-02
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多