python - 如何使用python解析类中的嵌套json
问题描述
如何使用具有相同键的 python 解析类中的嵌套 JSON?
我试过这个:
class RowCol(BaseModel):
Row1 : int
Row2 : int
Col1 : int
Col2 : int
class Item(BaseModel):
UseROI: bool
Comment: str
ROI : List[RowCol]
class ItemList(BaseModel):
SaveImageResult: bool
description: Optional[str] = None
OCR_ROI : List[Item]
然后,我得到了这个:
{
"SaveImageResult": true,
"description": "string",
"OCR_ROI": [
{
"UseROI": true,
"Comment": "string",
"ROI": [
{
"Row1": 0,
"Row2": 0,
"Col1": 0,
"Col2": 0
}
]
}
]
但是,我想要的数据具有相同的键,但值不同:
{
"SaveImageResult": false,
"description": "string",
"OCR_ROI": [
{
"UseROI": true,
"Comment": "",
"ROI": {
"Row1": 0,
"Col1": 0,
"Row2": 200,
"Col2": 200
}
},
{
"UseROI": false,
"Comment": "",
"ROI": {
"Row1": 1,
"Col1": 0,
"Row2": 200,
"Col2": 200
}
}
]
我该如何解决这个问题?
我尝试Optional[]
代替,List[]
但它不起作用。
解决方案
我做了一些改变,但我认为这就是你要找的。
更多问题,请使用评论。
代码
注意:(1)就像在你的代码中一样,我不是定义类变量,而是使用__init__
. 在这种情况下,在类级别定义变量可能会导致数据损坏,因此请尽量避免它们!
(2) 在问题中,BaseModel 没有定义,所以我冒昧地假设它如下所示,并导入一些必要的导入
from typing import List, Optional, Text
class BaseModel:
pass
class RowCol(BaseModel):
def __init__(self, Row1: int, Row2: int, Col1: int, Col2: int):
self.Row1 = Row1
self.Row2 = Row2
self.Col1 = Col1
self.Col2 = Col2
class Item(BaseModel):
def __init__(self, UseROI: bool, Comment: str, ROI: List[RowCol]):
self.UseROI = UseROI
self.Comment = Comment
self.ROI = ROI
class ItemList(BaseModel):
def __init__(self, SaveImageResult: bool, OCR_ROI: List[Item], description: Optional[Text]):
self.SaveImageResult = SaveImageResult
self.OCR_ROI = OCR_ROI
self.description = description
在 python中false
&true
无效。您需要将它们转换为True
or False
。如果您有data
或输入字符串或 json 格式,则使用json.loads
将整个 json 转换为 Python dict 对象。
数据
data = {
"SaveImageResult": False,
"description": "string",
"OCR_ROI": [
{
"UseROI": True,
"Comment": "",
"ROI": {
"Row1": 0,
"Col1": 0,
"Row2": 200,
"Col2": 200
}
},
{
"UseROI": False,
"Comment": "",
"ROI": {
"Row1": 1,
"Col1": 0,
"Row2": 200,
"Col2": 200
}
}
]
}
转型
下面是python代码转换(数据->python对象)
for i in range(len(data['OCR_ROI'])):
data['OCR_ROI'][i]['ROI'] = RowCol(**data['OCR_ROI'][i]['ROI'])
data['OCR_ROI'][i] = Item(**data['OCR_ROI'][i])
final_object = ItemList(**data)
测试
经过上述改造,我正在测试
>>> print(final_object.description)
string
>>> print(final_object.OCR_ROI[0].ROI.Col2)
200
>>> print(final_object.OCR_ROI[1].ROI.Row1)
1
推荐阅读
- java - 为什么 removeif() 在集合流中不可用
- css - 考虑到border-top和border-bottom应该为零,如何结合border-color和border-width属性?
- sql - LIKE 表达式的左侧必须计算为 varchar?
- android - Kotlin - SimpleDateFormat 解析需要无限时间
- javascript - 算法挑战:重复一个字符串
- sql - 通过内部连接 2 个表来检索名称而不是 ID
- javascript - 如何使用 Javascript 从浏览器获取电池百分比?
- java - 如何确定哪些元素用作 cssQuery 的参数
- swagger - 具有 Swashbuckle.AspNetCore 的不同 swagger 文档的不同 DocInclusionPredicate
- php - 如何在 Laravel 5.8 中集成 Instagram API(Feed)?