【问题标题】:JSON string parsing error KeyError: 'vrm'JSON 字符串解析错误 KeyError: 'vrm'
【发布时间】:2022-01-01 02:18:23
【问题描述】:

我已将以下 python 代码拼接在一起,但我正在努力处理KeyError: 'vrm'

我的目标是解析 JSON 字符串并仅打印特定的 JSON 对象。

#!/usr/bin/python3
import json

class Vehicle:
    def __init__(self,responseInfo, code, desc, data, vrm, vin, engineNumber, capId, capCode, manufacturer, model, vehicleType, registrationDate, firstRegistrationDate, body, doors, engineSize, fuel, fuelDelivery, transmission, isScraped, isExported, isImported, images, exactMatch, url, mainImage):
        self.responseInfo = responseInfo
        self.code = code
        self.desc = desc
        self.data = data
        self.vrm = vrm
        self.vin = vin
        self.engineNumber = engineNumber
        self.capId = capId
        self.capCode = capCode
        self.manufacturer = manufacturer
        self.model = model
        self.vehicleType = vehicleType
        self.registrationDate = registrationDate
        self.firstRegistrationDate = firstRegistrationDate
        self.body = body
        self.doors = doors
        self.engineSize = engineSize
        self.fuel = fuel
        self.fuelDelivery = fuelDelivery
        self.transmission = transmission
        self.isScraped = isScraped
        self.isExported = isExported
        self.isImported = isImported
        self.images = images
        self.exactMatch = exactMatch
        self.url = url
        self.mainImage = mainImage

def vehicleDecoder(obj):
        return Vehicle(obj['vrm'], obj['vin'], obj['engineNumber'], obj['capId'], obj['capCode'], obj['manufacturer'], obj['model'], obj['vehicleType'], obj['registrationDate'], obj['firstRegistrationDate'], obj['body'], obj['doors'], obj['engineSize'], obj['fuel'], obj['fuelDelivery'], obj['transmission'], obj['isScraped'], obj['isExported'], obj['isImported'], obj['images'], obj['exactMatch'], obj['url'], obj['mainImage'])

vehicleObj = json.loads('{"responseInfo":{"code":0,"desc":"Success"},"data":{"vrm":"MA71VWG","vin":"WBATS120009H40802","engineNumber":"A1566412","capId":91400,"capCode":"BMX320MS 5EXTA4 4","manufacturer":"BMW","model":"X3","vehicleType":"Car","registrationDate":"27/09/21","firstRegistrationDate":"27/09/21","body":"Estate","doors":"5","engineSize":"1998","fuel":"Petrol/PlugIn Elec Hybrid","fuelDelivery":"Turbo","transmission":"Automatic","isScraped":"No","isExported":"No","isImported":"No","images":[{"viewpoint":"Front Three Quarter","exactMatch":true,"url":"https://soap.cap.co.uk/images/VehicleImage.aspx?SUBID=171774&HASHCODE=92A987528AB2F2215A7372DADD8CE57C&DB=CAR&CAPID=91400&WIDTH=&HEIGHT=&IMAGETEXT=&VIEWPOINT=3","mainImage":true}]}}')
print(vehicleObj) #works
#vehicleObj = (vehicleObj['data'])
print(vehicleObj) #works
vehicleObj = json.dumps(vehicleObj)
print(vehicleObj)
vehicleObj = json.loads(str(vehicleObj), object_hook=vehicleDecoder)
#print(vehicleObj)
print(vehicleObj.vrm, vehicleObj.vin, vehicleObj.engineNumber, vehicleObj.capId, vehicleObj.capCode, vehicleObj.manufacturer, vehicleObj.model, vehicleObj.vehicleType, vehicleObj.registrationDate, vehicleObj.firstRegistrationDate, vehicleObj.body, vehicleObj.doors, vehicleObj.engineSize, vehicleObj.fuel, vehicleObj.fuelDelivery, vehicleObj.transmission, vehicleObj.isScraped, vehicleObj.isExported, vehicleObj.isImported)

下面的错误输出

Traceback (most recent call last):
  File "C:\Users\jack\Desktop\Python-Project\test.py", line 42, in <module>
    vehicleObj = json.loads(str(vehicleObj), object_hook=vehicleDecoder)
  File "C:\Python\Python39\lib\json\__init__.py", line 359, in loads
    return cls(**kw).decode(s)
  File "C:\Python\Python39\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python\Python39\lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
  File "C:\Users\jack\Desktop\Python-Project\test.py", line 34, in vehicleDecoder
    return Vehicle(obj['vrm'], obj['vin'], obj['engineNumber'], obj['capId'], obj['capCode'], obj['manufacturer'], obj['model'], obj['vehicleType'], obj['registrationDate'], obj['firstRegistrationDate'], obj['body'], obj['doors'], obj['engineSize'], obj['fuel'], obj['fuelDelivery'], obj['transmission'], obj['isScraped'], obj['isExported'], obj['isImported'], obj['images'], obj['exactMatch'], obj['url'], obj['mainImage'])
KeyError: 'vrm'

谁能发现我哪里出了问题或有更好的解决方案来解析 JSON 输出?

【问题讨论】:

  • edit您的问题并发布full text of any errors or tracebacks
  • 您应该查看传递给vehicleDecoder 的对象,它不是您认为的那样。 The docs 将有助于描述 object_hook 的工作原理。
  • 欢迎来到 Stack Overflow!请拨打tour。如需调试帮助,您需要创建一个minimal reproducible example,包括最少的代码、最少的示例输入和预期的输出。有关更多提示,请参阅How to Ask
  • 你遇到了一个棘手的问题。问题是您有嵌套的字典,并且您希望将它们展平。 json.loads 为它找到的每一个字典调用你的object_hook,包括嵌套字典。您可以通过将if 'vrn' not in obj: return obj 添加到您的解码器来仅提取data dict,但即便如此,您正在寻找exactMatch,但它不会存在。你不能真的为此使用钩子。您需要对其进行解码,然后对结果进行后处理。

标签: python json


【解决方案1】:

如果您将此示例减少到触发问题所需的最低限度,问题就会更加清晰:

import json


class Vehicle:
    def __init__(self, vrm):
        self.vrm = vrm


def vehicleDecoder(obj):
        return Vehicle(obj['vrm'])

vehicle_str = '{"data":{"vrm":"MA71VWG"}}'

vehicleObj = json.loads(vehicle_str, object_hook=vehicleDecoder)

这仍然会产生 KeyError。为什么?加载 json 时,会在每个对象上调用对象挂钩。您可能打算在包含“vrm”键的对象上调用它,但从技术上讲,{"data": ... 部分也是一个对象。

你怎么能解决这个问题?不要使用 object_hook。像这样解析json:

vehicleJson = json.loads(...)
vehicleObj = vehicleDecoder(vehicleJson['data'])

【讨论】:

  • 我喜欢这个选项,这是我的第一次尝试,但问题是他希望第一个 images dict 中的元素也是其中的一部分。当然,这可以在构造函数中解决。
【解决方案2】:

这会以更简单的方式满足您的要求。

#!/usr/bin/python3
import json
from pprint import pprint

class Vehicle:
    def __init__(self, obj):
        self.__dict__.update( obj['data'] )
        self.__dict__.update( self.images[0] )

vehicleObj = json.loads('{"responseInfo":{"code":0,"desc":"Success"},"data":{"vrm":"MA71VWG","vin":"WBATS120009H40802","engineNumber":"A1566412","capId":91400,"capCode":"BMX320MS 5EXTA4 4","manufacturer":"BMW","model":"X3","vehicleType":"Car","registrationDate":"27/09/21","firstRegistrationDate":"27/09/21","body":"Estate","doors":"5","engineSize":"1998","fuel":"Petrol/PlugIn Elec Hybrid","fuelDelivery":"Turbo","transmission":"Automatic","isScraped":"No","isExported":"No","isImported":"No","images":[{"viewpoint":"Front Three Quarter","exactMatch":true,"url":"https://soap.cap.co.uk/images/VehicleImage.aspx?SUBID=171774&HASHCODE=92A987528AB2F2215A7372DADD8CE57C&DB=CAR&CAPID=91400&WIDTH=&HEIGHT=&IMAGETEXT=&VIEWPOINT=3","mainImage":true}]}}')
pprint(vehicleObj)

vehicleObj = Vehicle(vehicleObj)

print(vehicleObj.vrm, vehicleObj.vin, vehicleObj.engineNumber, vehicleObj.capId, vehicleObj.capCode, vehicleObj.manufacturer, vehicleObj.model, vehicleObj.vehicleType, vehicleObj.registrationDate, vehicleObj.firstRegistrationDate, vehicleObj.body, vehicleObj.doors, vehicleObj.engineSize, vehicleObj.fuel, vehicleObj.fuelDelivery, vehicleObj.transmission, vehicleObj.isScraped, vehicleObj.isExported, vehicleObj.isImported)

输出:

MA71VWG WBATS120009H40802 A1566412 91400 BMX320MS 5EXTA4 4 BMW X3 Car 27/09/21 27/09/21 Estate 5 1998 Petrol/PlugIn Elec Hybrid Turbo Automatic No No No

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多