带有(反)序列化器和模式验证的Python JSON REST框架(jsonschema / avro)

时间:2016-06-02 09:18:57

标签: python json deserialization avro jsonschema

我认为我的问题非常普遍。我想在Python中构建一个JSON REST API(后面可能还有R),以便在应用程序之间交换数据。 (此时我不想使用BJSON或其他二进制格式)

鉴于模式和(反)序列化框架的可用性,我认为构建一个执行以下操作的系统是直截了当的:

  1. 它通过HTTP get请求输入,
  2. 将其转换/解析/反序列化为python对象,
  3. 在给定通用模式语言描述的情况下验证python对象,
  4. 使用参数做一些事情来获取结果数据,和
  5. 将结果数据序列化为JSON,
  6. 验证结果json,
  7. 返回它。

我想使用与语言无关的模式语言 - 没有任何只用于一种语言的语言。我将avro和json-schema视为模式语言和(de)序列化的生态系统,但到目前为止我找不到任何涵盖该法案的工具。一个特殊的问题是反序列化。有一些库可以序列化,但是后来有URL GET参数的问题,这些参数是字符串而不是整数。

名=米奇安培;年龄= 4

给出一个架构(avro)

{
"type": "record",
"name": "User",
"namespace": "example.avro",
"fields": [
    {
    "name": "name",
    "type": "string"
    },
    {
    "name": "age",
    "type": "int"
    }
]
}

我想得到一个字典(名字='米奇',年龄= 4)。

我已经失去了很多时间已经尝试了不同的工具和框架,而我正处于考虑从头开始编写反序列化器的地步。

3 个答案:

答案 0 :(得分:0)

序列化和反序列化的问题并不十分清楚。大多数Web框架不会将URL查询参数视为JSON对象,而是单独处理每个密钥,并允许您将查询字符串作为字典(或作为请求处理程序的参数,具体取决于框架)进行访问。像>>> array_str = [['2014', '913', '5.78254241807211', '52.3749951170618', '2014', '1', '2024448.00', '89316.00', '29187.00', '427000.00', '60.00', '0'], ['1', '2']] >>> array_n = [[float(num) for num in item] for item in array_str] >>> array_n [[2014.0, 913.0, 5.7825424180721097, 52.3749951170618, 2014.0, 1.0, 2024448.0, 89316.0, 29187.0, 427000.0, 60.0, 0.0], [1.0, 2.0]] >>> 这样的东西。 JSON通常显示为POST,PUT,PATCH的有效负载以及请求的响应。即使在这种情况下,您也可以将其作为字符串获取并执行类似request.query['name']的操作来获取Python数据结构,然后您可以使用json-schema或avro验证器库自由验证。

答案 1 :(得分:0)

我想到了两件事。

首先,有一个Eve REST framework,写在Flask之上。

它的作者还创建了一个名为Cerberus的模式/验证语言(并在Eve中使用),它完全符合您的要求。 Eve将您的JSON存储在MongoDB中。

如果您的应用程序不是非常广泛,并且使用开箱即用的Django或包装中已有的各种工具,我会坚持使用Eve。 (哎呀,不打算在这里开始永恒的Django-vs-Flask火焰)

其次,有Mongoengine library为JSON提供Django风格的模式。

它的目的是为Django提供MongoDB的支持,并设计其架构模仿Django的架构。 Mongoengine本身非常稳定,但它与好Django REST FrameworkDjango REST Framework-Mongoengine的集成绝不是必然的。

此外,还有Mongoengine与Eve和Flask的绑定。

答案 2 :(得分:0)

我环顾四周,找不到我想要的东西。像Marshmallow这样的项目很接近。它们允许规范模式并提供序列化,但我希望jsonschema格式具有互操作性。

所以我围绕一个代表数据的pandas数据框编写了我自己的序列化器/反序列化器类。它有方法

  1. 用于从字典或json对象创建数据帧(反序列化)2。用于强制数据类型,
  2. 用于推断架构,
  3. 用于验证架构,
  4. 序列化为json。