将json文档序列化并反序列化为python数据结构

easyjsonparser的Python项目详细描述


easyjsonparser,一个用于分析和验证 json模型

生成状态

现代web框架都使用orm系统来实现 数据库上的服务器端操作:例如,symfony3的条令 (php),Mongoose for MongoDB数据库。

orms能够读取数据并将其转换为 内存中的对象。他们也可以把一个特殊的物体转换成 到基础存储格式。

本项目背后的动机

虽然类orm系统在web开发中很常见,但它们是 对于其他目的来说都是不可能的。例如,分析配置 文件(是的,这就是我设计这个库的原因!)并验证 内容,或在文件中输出配置。

依赖关系

easyjsonparser只使用python的标准库,特别是 json哪个模块 序列化和取消序列化源/目标数据。

easyjsonparser是为python 3构建的。

安装

从pypi获取库:

> pip install easyjsonparser

基本示例

在本节中,我们将定义虚拟数据结构user,它遵循以下模式:

{"id":"xxx047AD_","username":"jsonisnice","age":16,"isAdmin":false}

easyjsonparser可以使用以下代码将解析数据字符串提取到对象中:

importeasyjsonparserasejpfromeasyjsonparser.documentimportJSONObjectDocumentclassUser(JSONObjectDocument):id=ejp.String()username=ejp.String()age=ejp.Integer()isAdmin=ejp.Boolean()# In this example, the data string is directly# written in the code but it can have# various source such as reading a file...data_string="""..."""user=User.loads(data_string)

如果您已经将数据加载到字典中了呢?然后,只需使用加载而不是加载

user=User.load({"id":"xxx047AD_","username":"jsonisnice","age":16,"isAdmin":False})

我们只需打印用户实例即可获得其表示:

>>>print(user)<JSONUserInstance:{"id":<JSONValueStringInstance:"xxx047AD_">,"username":<JSONValueStringInstance:"jsonisnice">,"age":<JSONValueIntegerInstance:16>,"isAdmin":<JSONValueBoolInstance:False>}>

如果我们现在要分析用户的列表,该怎么办?

fromeasyjsonparser.documentimportJSONAArrayDocumentclassUserList(JSONArrayDocument);schema=User()users=UserList.load([{...},{...}])

文档类型对象(即继承自jsonobjectdocumentjsonarraydocument的对象)可以相互混合。

它们也有多种类型,但顶级数据结构必须始终是一个jsonobjectdocumentjsonarraydocument

好吧,现在如果我们想把它转换回json字符串呢?让我们使用来实现json()

>>>user.to_json()'{"id": "xxx047AD_", "username": "jsonisnice", "age": 16, "isAdmin": False}'

文档

文档是继承自jsonobjectdocumentjsonarraydocument的类。它们是特殊类型的对象数组,因为它们包含用于解析数据的类方法。它们的行为类似于normal对象数组但具有作为顶级数据结构的能力。

jsonarraydocument的定义与使用常规的ejp.array()略有不同:模式必须定义为类属性而不是构造函数参数。

classStringList(JSONArrayDocument):schema=String()

以下是特殊方法:

jsonobjectdocument.load(obj=none)(@classmethod)

使用输入源obj创建jsonobjectdocument。如果没有输入,则计算空数据结构。如果输入是给定的,但不是措辞,则会引发异常。

jsonobjectdocument.loads(obj_string)(@classmethod)

从字符串创建jsonobjectdocument。使用python标准库中的json.loads()将数据解析为字典。如果obj_string未重新发送有效的json对象,则会引发异常。

jsonarraydocument.load(*values)(@classmethod)

从值列表中创建jsonarraydocument可以是可变数组,但也可以传递必须是列表或元组的单个输入。

jsonarraydocument.loads(数组字符串)(@classmethod)

从字符串创建jsonarraydocument。使用python标准库中的json.loads()将数据解析为数组。如果数组字符串不代表有效的json数组,则会引发异常。

可用类型

ejp.string()

表示JSON字符串。

ejp.integer()

表示JSON整数。

*警告:布尔值和浮点值可以作为输入,但它们将被转换为整数,并使用int()。发生转换时会发出警告。

TOdo:添加一个选项以禁用/启用此行为

ejp.float()

表示浮点数。从整数和布尔值转换的工作方式为ejp.integer()

ejp.boolean()

表示布尔值。从浮点数和布尔值转换的工作方式是ejp.integer()

ejp.null()

表示一个null值。如果输入不是none(在python中)或null(作为json字符串),则会引发解析异常。

ejp.object()

表示JSON对象。

不能在构造函数中定义属性:它们必须定义为类属性,如下所示:

classMyObject(ejp.Object):property1=ejp.String()property2=ejp.Boolean()...

注意:请记住,需要使用jsonobjectdocument来定义顶级对象

ejp.array()

表示JSON数组。数组必须遵循必须传递给ejp.array()的构造函数的架构。如果架构无效,则会引发异常。

> pip install easyjsonparser
0

注意:请记住,需要使用jsonarraydocument来定义顶级数组

ejp.empty()

表示空值。用于可选属性/值:如果要清除可选参数的内容,请将其值设置为ejp.empty()

许可证

此软件在麻省理工学院许可证下分发

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在数据库中存储密码的java加密方法   java正则表达式否定整个正则表达式   java为什么要得到这个Hashmap输出?   看不到玻璃鱼爪哇SE 6   类对象包装器中的Java基本数据字段   java从文本文件中读取整数并存储到单独的变量中?(扫描仪)   优化大型Java数据阵列的处理和管理   如何使用Java XML包装类创建对象   java为ExecutorService invokeAll()创建包装器   java如何在Android Studio 1.0.0中设置Facebook SDK?获取SDK位置未找到错误   java在尝试从线程启动动画时调用了FromErrorThreadException   java根据哈希确认文件内容   通过java在neo4j中获取索引值相同的所有节点?   java为什么我的Validare邮政编码(布尔)程序返回false?   java会话自动从servlet/jsp生成,尽管存在以下条件:<%@page session=“false”%>   创建新LANsocket时拒绝java连接   java如何多线程更新由sql代码更新的数据库?   安卓 Java使用类作为集合来添加项   安卓为什么我的清单文件不声明java包?