解析 JSON 并将数据存储在 Python 类中

Posted

技术标签:

【中文标题】解析 JSON 并将数据存储在 Python 类中【英文标题】:Parse JSON and store data in Python Class 【发布时间】:2012-09-04 10:19:08 【问题描述】:

这是我的 JSON 数据

[
    
        "id":1,
        "name":"abc",
        "phone": "12345",
        "Charecteristics": [
            
                "id":1,
                "name":"Good Looking",
                "rating": "Average",
            
            
                "id":2,
                "name":"Smart",
                "rating": "Excellent",
            
        ]
    ,
     ... ,
     ... 
]

我在 Python 中有两个类

class Character(object):
    id = 0
    name = ""
    rating = ""

class Person(object):
    id = 0
    name = ""
    phone = ""
    Characteristics = []

我需要解析 JSON 数据并实例化适当的类。这些类是不言自明的:即 Person 有一个 Character 类的数组。

我如何实例化这些并适当地存储数据?

另外,我将如何访问特定的个人数据?即人的详细信息和特征

【问题讨论】:

类似问题:***.com/questions/3847399/… 请注意,您的 JSON 示例格式错误。除了您使用的奇数引号之外,Character 对象中也不能有多个 Character 键。 我已经清理了您的 JSON 以使其真正有效;请注意,我已经将人员组和特征组都变成了列表(就像通常那样)。 非常感谢@MartijnPieters @Tichodroma:下次我一定会做更多的研究。抱歉,我在最初的几次尝试中没有找到类似的问题。 【参考方案1】:

看看colander;它使将 JSON 数据结构转换为 Python 对象变得非常容易。

你定义一个模式:

import colander


class Characteristic(colander.MappingSchema):
    id = colander.SchemaNode(colander.Int(),
                             validator=colander.Range(0, 9999))
    name = colander.SchemaNode(colander.String())
    rating = colander.SchemaNode(colander.String())        


class Characteristics(colander.SequenceSchema):
    characteristic = Characteristic()


class Person(colander.MappingSchema):
    id = colander.SchemaNode(colander.Int(),
                             validator=colander.Range(0, 9999))
    name = colander.SchemaNode(colander.String())
    phone = colander.SchemaNode(colander.String())
    characteristics = Characteristics()


class Data(colander.SequenceSchema):
    person = Person()

然后使用以下内容传入您的 JSON 数据结构:

deserialized = Data.deserialize(json.loads(json_string)) 

【讨论】:

谢谢.. :-) 我是 Python 新手,但必须使用 Web 服务,所以使用 dJango.. 请考虑我是业余爱好者.. 还有一个问题.. 这并不容易。如果它在给定特定 JSON 字符串的情况下生成 python 类,那就太容易了。 @Vanuan 有什么办法吗? @Jonathan 最接近的是这个github.com/cwacek/python-jsonschema-objects 但它仍然需要为每个字段指定类型。 谢谢@Vanuan,它看起来很有前途!【参考方案2】:

如果你用 python 3.6+ 编写,最简单的可能是使用marshmallow-dataclass:

from marshmallow_dataclass import dataclass
from typing import List

@dataclass
class Character:
    id : int
    name : str
    rating : str

@dataclass
class Person:
    id : int
    name : str
    phone : str
    characteristics : List[Character]

my_person = Person.Schema().loads(json_str)

【讨论】:

以上是关于解析 JSON 并将数据存储在 Python 类中的主要内容,如果未能解决你的问题,请参考以下文章

JSON 解析:从 NSDictionary 检索数据并将其存储在数组中

Python - 如何解析 JSON 并将其保存到 MYSQL 数据库

如何从 json(url) 解析数据并将数据发送到 url

在 iOS 中解析 JSON 并将结果存储到 Array

如何在 Python 中解析 JSON 并将 2 个字段放入字典中? [复制]

如何拆分/解析 JSON 数据并将其保存到 SQL 服务器中?