【问题标题】:How to extract specific values from JSON如何从 JSON 中提取特定值
【发布时间】:2020-07-03 18:58:54
【问题描述】:

我需要从加载到公共APIJson 中提取键和值。目前 mi 代码从我的 extract_values 函数中提取所有值作为列表。但我只需要一个camera_id 及其对应的值image 每增量分钟。我遇到了麻烦,因为每个 get() 调用都会返回来自 Json 的所有值。

JSON:

 "items": [
    {
      "timestamp": "2020-07-04T02:00:07+08:00",
      "cameras": [
        {
          "timestamp": "2020-07-04T01:59:27+08:00",
          "image": "https://images.data.gov.sg/api/traffic-images/2020/07/b0e99414-f401-47ab-b7a4-223d83f76a2c.jpg",
          "location": {
            "latitude": 1.27414394350065,
            "longitude": 103.851316802547
          },
          "camera_id": "1501",
          "image_metadata": {
            "height": 240,
            "width": 320,
            "md5": "fd1f8e010c789eb59f105a8017c4170e"
          }
        }, 
...
]

预期输出:

camera_id | Image
1501        https://images.data.gov.sg/api/traffic-images/2020/07/b0e99414-f401-47ab-b7a4-223d83f76a2c.jpg

应该注意的是,我有 N 个来自不同时间戳的 endpoint url。但我只想要来自我所有不同网址的相同camera_id 及其image 属性。

到目前为止我的代码:

#Function to extract parameters from JSON
def extract_values(obj, key):
    #Pull all values of specified key from nested JSON.
    arr = []

    def extract(obj, arr, key):
        #Recursively search for values of key in JSON tree.
        if isinstance(obj, dict):
            for k, v in obj.items():
                if isinstance(v, (dict, list)):
                    extract(v, arr, key)
                elif k == key:
                    arr.append(v)
        elif isinstance(obj, list):
            for item in obj:
                extract(item, arr, key)
        return arr

    results = extract(obj, arr, key)
    return results

def getURLS():

    #Retrieve url from different deltas
    endpoint = "https://api.data.gov.sg/v1/transport/traffic-images"
    data = requests.get(endpoint)
    if (data):
        data = requests.get(endpoint).json()
        cam_list = extract_values(data,'camera_id')#Extract all camera_id values as list
        images_list = extract_values(data,'image') #Extract all images values as list

if __name__ == "__main__":    
    getURLS()

我怎样才能做到这一点?提前致谢

【问题讨论】:

  • 嗨,我导航到您共享的数据集。由于数据格式是 python 字典,您可以使用像 camera_id = dt["items"][0]["cameras"][0]["camera_id"] img = dt["items"][0]["cameras" ][0][“图片”]

标签: python json


【解决方案1】:

在此示例中,变量 req_camera_id 包含您要匹配的 camera_id。因此,您可以根据需要遍历子词典。但我认为在这种情况下你不需要递归调用。

import requests

req_camera_id = '1501'

endpoint = 'https://api.data.gov.sg/v1/transport/traffic-images'
response = requests.get(endpoint)
if response.status_code == 200:
    data = response.json()
    for item in data['items']:
        for cam in item['cameras']:
            camera_id = cam['camera_id']
            if camera_id == req_camera_id:
                image = cam['image']
                print(f'{camera_id} {image}')

给予:

1501 https://images.data.gov.sg/api/traffic-images/2020/07/4c62761d-450d-4aa1-895f-c16482fa620f.jpg

【讨论】:

    【解决方案2】:

    items 是一个对象列表。只需遍历对象列表并从每个对象中获取您需要的值。

    cam_ids = []
    images = []
    
    for item in items:
        cam_ids.append(item['camera_id'])
        images.appned(item['image'])
    

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多