【问题标题】:Parse JSON and select a specific key in python解析 JSON 并在 python 中选择特定键
【发布时间】:2017-12-28 13:28:57
【问题描述】:

我正在尝试在此代码中选择一个特定的键,即 163、203 和 13。基本上,每次我的函数运行时,我都会将这 3 个代码中的一个存储在一个变量中,我可以t 弄清楚如何解析 Json 文件中的特定元素。我想创建一个循环,例如在键“203”处停止并返回结果。

with open('data.json') as data_file:
    data = json.load(data_file, object_pairs_hook=OrderedDict)
    for key, value in data.items():
        id = '203'
        id_value = value['payload']['price']
        pack = id_value[id]
        print(pack) #pack should be returning the value of the key '203'

这是 JSON。 JSON 分为 3 个部分,每个部分都以我不知道的随机密钥开头,如果您查看 JSON,在有效负载之后,有价格,然后是 id(例如“203”)。我需要得到这个id的值。

{
  "a506b5686": {
    "status": {
      "message": "Ok",
      "code": 0,
      "user": {
        "isBanned": false,
        "isNotConfirmed": false
      }
    },
    "payload": {
      "vat": 0,
      "price": {
        "163": {
          "100": {
            "country_id": "CN",
            "product_price": 16.54,
            "shipment_price": 2.31,
            "quantity": 100,
            "batchsize_id": 60348
          },
          "200": {
            "country_id": "CN",
            "product_price": 23.17,
            "shipment_price": 2.31,
            "quantity": 200,
            "batchsize_id": 60354
          },
          "300": {
            "country_id": "CN",
            "product_price": 28.29,
            "shipment_price": 2.31,
            "quantity": 300,
            "batchsize_id": 60360
          },
          "400": {
            "country_id": "CN",
            "product_price": 34.11,
            "shipment_price": 2.31,
            "quantity": 400,
            "batchsize_id": 60366
          },
          "500": {
            "country_id": "CN",
            "product_price": 39.33,
            "shipment_price": 2.31,
            "quantity": 500,
            "batchsize_id": 60372
          },
          "600": {
            "country_id": "CN",
            "product_price": 44.04,
            "shipment_price": 2.95,
            "quantity": 600,
            "batchsize_id": 60378
          },
          "700": {
            "country_id": "CN",
            "product_price": 48.32,
            "shipment_price": 2.95,
            "quantity": 700,
            "batchsize_id": 60384
          },
          "800": {
            "country_id": "CN",
            "product_price": 52.22,
            "shipment_price": 2.95,
            "quantity": 800,
            "batchsize_id": 60390
          },
          "900": {
            "country_id": "CN",
            "product_price": 55.79,
            "shipment_price": 2.95,
            "quantity": 900,
            "batchsize_id": 60396
          },
          "1000": {
            "country_id": "CN",
            "product_price": 59.07,
            "shipment_price": 2.95,
            "quantity": 1000,
            "batchsize_id": 60402
          },
          "maxDeliveryDays": 6,
          "minDeliveryDays": 4
        }
      },
      "maxDeliveryDays": 6,
      "minDeliveryDays": 4,
      "productionCountry": [
        "CN"
      ]
    },
    "pager": {
      "total": null,
      "current": 1,
      "count": null
    }
  },
  "a28bb008b": {
    "status": {
      "message": "Ok",
      "code": 0,
      "user": {
        "isBanned": false,
        "isNotConfirmed": false
      }
    },
    "payload": {
      "vat": 0,
      "price": {
        "203": {
          "100": {
            "country_id": "CN",
            "product_price": 16.21,
            "shipment_price": 2.31,
            "quantity": 100,
            "batchsize_id": 60972
          },
          "200": {
            "country_id": "CN",
            "product_price": 22.58,
            "shipment_price": 2.31,
            "quantity": 200,
            "batchsize_id": 60978
          },
          "300": {
            "country_id": "CN",
            "product_price": 27.5,
            "shipment_price": 2.31,
            "quantity": 300,
            "batchsize_id": 60984
          },
          "400": {
            "country_id": "CN",
            "product_price": 33.11,
            "shipment_price": 2.31,
            "quantity": 400,
            "batchsize_id": 60990
          },
          "500": {
            "country_id": "CN",
            "product_price": 38.14,
            "shipment_price": 2.31,
            "quantity": 500,
            "batchsize_id": 60996
          },
          "600": {
            "country_id": "CN",
            "product_price": 42.69,
            "shipment_price": 2.31,
            "quantity": 600,
            "batchsize_id": 61002
          },
          "700": {
            "country_id": "CN",
            "product_price": 46.82,
            "shipment_price": 2.95,
            "quantity": 700,
            "batchsize_id": 61008
          },
          "800": {
            "country_id": "CN",
            "product_price": 50.58,
            "shipment_price": 2.95,
            "quantity": 800,
            "batchsize_id": 61014
          },
          "900": {
            "country_id": "CN",
            "product_price": 54.02,
            "shipment_price": 2.95,
            "quantity": 900,
            "batchsize_id": 61020
          },
          "1000": {
            "country_id": "CN",
            "product_price": 57.18,
            "shipment_price": 2.95,
            "quantity": 1000,
            "batchsize_id": 61026
          },
          "maxDeliveryDays": 6,
          "minDeliveryDays": 4
        }
      },
      "maxDeliveryDays": 6,
      "minDeliveryDays": 4,
      "productionCountry": [
        "CN"
      ]
    },
    "pager": {
      "total": null,
      "current": 1,
      "count": null
    }
  },
  "a2e2a89bf": {
    "status": {
      "message": "Ok",
      "code": 0,
      "user": {
        "isBanned": false,
        "isNotConfirmed": false
      }
    },
    "payload": {
      "vat": 0,
      "price": {
        "13": {
          "100": {
            "country_id": "CN",
            "product_price": 14.95,
            "shipment_price": 2.31,
            "quantity": 100,
            "batchsize_id": 58240
          },
          "200": {
            "country_id": "CN",
            "product_price": 20.37,
            "shipment_price": 2.31,
            "quantity": 200,
            "batchsize_id": 58226
          },
          "300": {
            "country_id": "CN",
            "product_price": 24.57,
            "shipment_price": 2.31,
            "quantity": 300,
            "batchsize_id": 58237
          },
          "400": {
            "country_id": "CN",
            "product_price": 29.41,
            "shipment_price": 2.31,
            "quantity": 400,
            "batchsize_id": 58228
          },
          "500": {
            "country_id": "CN",
            "product_price": 33.76,
            "shipment_price": 2.31,
            "quantity": 500,
            "batchsize_id": 58234
          },
          "600": {
            "country_id": "CN",
            "product_price": 37.69,
            "shipment_price": 2.95,
            "quantity": 600,
            "batchsize_id": 58235
          },
          "700": {
            "country_id": "CN",
            "product_price": 41.25,
            "shipment_price": 2.95,
            "quantity": 700,
            "batchsize_id": 58264
          },
          "800": {
            "country_id": "CN",
            "product_price": 44.5,
            "shipment_price": 2.95,
            "quantity": 800,
            "batchsize_id": 58270
          },
          "900": {
            "country_id": "CN",
            "product_price": 47.46,
            "shipment_price": 2.95,
            "quantity": 900,
            "batchsize_id": 58239
          },
          "1000": {
            "country_id": "CN",
            "product_price": 50.2,
            "shipment_price": 2.95,
            "quantity": 1000,
            "batchsize_id": 58223
          },
          "maxDeliveryDays": 6,
          "minDeliveryDays": 4
        }
      },
      "maxDeliveryDays": 6,
      "minDeliveryDays": 4,
      "productionCountry": [
        "CN"
      ]
    },
    "pager": {
      "total": null,
      "current": 1,
      "count": null
    }
  }
}

【问题讨论】:

  • 你能详细说明这个问题吗?密钥可以出现在 json 树中的任何级别吗?您需要打印的究竟是什么?
  • 我编辑了,问题,我的问题更清楚了吗?
  • 价格下方还有一把钥匙,你也得买一把
  • 是的,价格正下方的键,是我在解析代码之前在变量中的键,我需要获取该键的值。

标签: python json parsing jsonparser


【解决方案1】:

在访问它之前检查它存在的 id 有什么问题。

import json
from collections import OrderedDict

id = '203'

with open('data,json') as data_file:
    data = json.load(data_file, object_pairs_hook=OrderedDict)
    for key, value in data.items():
        id_value = value['payload']['price']
        if id in id_value: # check first if id is present
            pack = id_value[id]
            print(pack) #pack should be returning the value of the key '203'

【讨论】:

    【解决方案2】:
    with open('data.json') as data_file:
        data = json.load(data_file, object_pairs_hook=OrderedDict)
        for key, value in data.items():
            id = '203'
            if value['payload']['price'] == id:
                print(value['payload']['price'])
    

    这就是我可以从你的问题中得出的结论。如果这不是预期的,请在下方评论。

    【讨论】:

    • 也谢谢你!这里唯一的问题是“==”,它应该是“if id in value[..] 但是谢谢你们!
    【解决方案3】:

    我尝试将 JSON 对象展平,以便所有键位于同一级别。

    import json
    from pandas.io.json import json_normalize
    from collections import OrderedDict
    
    with open('data.json') as data_file:
    data = json.load(data_file, object_pairs_hook=OrderedDict)
    data=json_normalize(data)
    id='163'
    for key, value in data.items():
        nested_ids = key.split('.')
        if (id in nested_ids):
            print(value)
    

    这是否能让你朝着正确的方向前进?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多