【发布时间】: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 输出?
【问题讨论】:
-
您应该查看传递给
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添加到您的解码器来仅提取datadict,但即便如此,您正在寻找exactMatch,但它不会存在。你不能真的为此使用钩子。您需要对其进行解码,然后对结果进行后处理。