【问题标题】:Pulling info from Json data从 Json 数据中提取信息
【发布时间】:2019-09-06 22:14:22
【问题描述】:

问题:

我无法从 ups 中提取一些信息。 shipToAddress 部分中的城市和州。

以下是我通过请求从 ups 网站提取的易于阅读格式的数据:

数据:

data = {
    'statusCode': '200',
    'statusText': 'Successful',
    'isLoggedInUser': False,
    'trackedDateTime': '04/16/2019 1:33 P.M. EST',
    'isBcdnMultiView': False,
    'trackDetails': [{
        'errorCode': None,
        'errorText': None,
        'requestedTrackingNumber': '1Z3774E8YN99957400',
        'trackingNumber': '1Z3774E8YN99957400',
        'isMobileDevice': False,
        'packageStatus': 'Loaded on Delivery Vehicle',
        'packageStatusType': 'I',
        'packageStatusCode': '072',
        'progressBarType': 'InTransit',
        'progressBarPercentage': '90',
        'simplifiedText': '',
        'scheduledDeliveryDayCMSKey': 'cms.stapp.tue',
        'scheduledDeliveryDate': '04/16/2019',
        'noEstimatedDeliveryDateLabel': None,
        'scheduledDeliveryTime': 'cms.stapp.eod',
        'scheduledDeliveryTimeEODLabel': 'cms.stapp.eod',
        'packageCommitedTime': '',
        'endOfDayResCMSKey': None,
        'deliveredDayCMSKey': '',
        'deliveredDate': '',
        'deliveredTime': '',
        'receivedBy': '',
        'leaveAt': None,
        'leftAt': '',
        'shipToAddress': {
            'streetAddress1': '',
            'streetAddress2': '',
            'streetAddress3': '',
            'city': 'OCEAN',
            'state': 'NJ',
            'province': None,
            'country': 'US',
            'zipCode': '',
            'companyName': '',
            'attentionName': '',
            'isAddressCorrected': False,
            'isReturnAddress': False,
            'isHoldAddress': False,
}}]}

代码:

data = response.text
addressinfo =json.loads(data)['trackDetails']['shipToAddress']

for entry in addressinfo:
    city = (entry['city'])  
    state = (entry['state'])
    country = (entry['country'])

我的预期结果:

city = '海洋'

状态 = 'NJ'

这是错误:

addressinfo =json.loads(data2)['trackDetails']['shipToAddress']

TypeError: 列表索引必须是整数或切片,而不是 str

【问题讨论】:

    标签: python


    【解决方案1】:

    注意 JSON 的格式:

    'trackDetails': [{
        ...
        'shipToAddress': {...}
    }]
    

    您尝试索引的 dict 实际上包含在列表中(注意方括号)。访问shipToAddress 字段的正确方法是这样做:

    addressinfo = json.loads(data2)['trackDetails'][0]['shipToAddress']
                                                   ^^^
    

    而不是你在做什么。

    【讨论】:

    • 好吧,这很有意义,谢谢你解释我的疏忽
    • @green-cload-guy 如果有多个 shipToAddress 部分,无论如何都要拉所有这些部分,还是我需要像上面的答案一样指定第一个?
    • 查看 this answer 以了解 JSON 密钥的一般唯一性 - 根据 JSON RFC,keys should be unique,因此您永远不应将 'shipToAddress' 视为同一字段中的相同密钥,我不确定 python 将如何处理这种行为(可能使用OrderedDict)。
    • 尽管如果有多组曲目详细信息,您可以遍历列表并从每组中获取shipToAddress,例如d['shipToAddress'] for d in json.loads(data2)['trackDetails'].
    【解决方案2】:

    当您返回 data = response.text 时,您应该改为使用 data = response.json(),因为它是一个 json。这将允许您像 json 一样访问它。相反,您将其转换为带有.text 的字符串,然后尝试将其重新加载,这不是必需的。

    然后访问城市:

    city = data['trackDetails'][0]['shipToAddress']['city']
    state = data['trackDetails'][0]['shipToAddress']['state']
    

    【讨论】:

    • 感谢您帮助我更好地理解我不必要的步骤,非常感谢
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2018-11-08
    • 2023-04-01
    • 2014-10-07
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多