簡體   English   中英

如何從 JSON 中提取特定值

[英]How to extract specific values from JSON

我需要從加載到公共APIJson中提取鍵和值。 目前 mi 代碼從我的extract_values function 中提取所有值作為列表。 但我每 delta 分鍾只需要一個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"
          }
        }, 
...
]

預期 output:

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()

我怎樣才能做到這一點? 提前致謝

在此示例中,變量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

items是一個對象列表。 只需遍歷對象列表並從每個 object 中獲取您需要的值。

cam_ids = []
images = []

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM