首页 > 解决方案 > 如何使用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[]但它不起作用。

标签: pythonjsonclass

解决方案


我做了一些改变,但我认为这就是你要找的。

更多问题,请使用评论。

代码

注意:(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无效。您需要将它们转换为Trueor 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

推荐阅读