IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> JSON Schema 支持复合规则一例 -> 正文阅读

[大数据]JSON Schema 支持复合规则一例

我经历过 XML+SOAP 的时代,曾经写过很多 xml document + xslt 的代码,也为自己的 emacs 写过一些 xml 的扩展。

对于大部分模型简单,变化快速的业务来说,json 的出现是一种进步,json 更简单,更适合阅读,可以很自然的适配常用编程语言的内置机制。

相对于各种?json 库的性能优化之争,json 的结构校验就比较少被关注了。但是对于应用业务,其实校验是非常重要的。我过去经历过的几个项目,基于不同的技术栈和演进路线,采用的 json schema 校验工具也各不相同。CSDN AI组目前使用的是 python 的 jsonschema 库 jsonschema · PyPI?。

这个库基于 json schema?

JSON Schema | The home of JSON Schema?

设计,充分利用了平台中立的规范,但是校验使用的参数是 python 数据结构。这是一个非常好的设计,首先 json schema 规范不依赖于具体的应用语言,这部分知识可以复用到各个不同的技术栈,这就确保了异构平台之间的沟通。比如 CSDN 内部就有基于 Java 和 Python 等不同语言的服务,只要遵循 json schema,就可以比较顺利的理解接口规范。而内部使用 python 数据结构,给开发带来了很大的便利。

因为历史原因,我们的一组 API 中有一个文档类型,存在两种不同的结构:

{
    "sample_id": "string",
    "title": "string",
    "body": "string"
}

{
    "article_id": "integer",
    "title": "string",
    "content": "string"
}

这其中 body 和 content 其实是同一个字段,sample_id 和 article_id 也一样,并且 article_id 其实就是整数,它在数据库中保存的也是整数。真实的情况比这两个定义更复杂一些,例如有一些接受?sample_id 的 API 其实接受整数,有一些接受 article_id 的 API 要求字符串。

程序层面处理这些差异其实不算特别难,写个简单的适配函数即可,但是在规范层面,除非在将来的升级维护中重写一组规范的 API,把这两种形式统一,否则这个差异很难消灭,它们已经被几个不同的团队使用,在不破坏其他部门的调用代码的情况下,无缝升级 API 不太现实。如果这部分 API 根据每种 case 都写一个 json schema,或者放弃这部分api的schema校验,无疑为将来的代码维护留下了隐患。

好在 json schema 为这种问题也提供了解决方案。 json schema 允许我们使用 oneOf 选择器组合多个定义,JSON数据满足其中某一个即可,再结合对字段类型的多类型定义,最终我们的项目代码中,这个schema如下:

        self.article_schema = {
            "properties": {
                "sample_id": {
                    "type": ["string", "integer"]
                },
                "article_id": {
                    "type": ["string", "integer"]
                },
                "title": {"type": "string"},
                "body": {"type": "string"},
                "content": {"type": "string"}
            },
            "oneOf": [
                {
                    "required": [
                        "title",
                        "body"
                    ]
                },
                {
                    "required": [
                        "title",
                        "content"
                    ]
                }
            ]

        }

这里面包含了对不同类型的文档 id 的支持,确保不同结构的文档约束在同一个框架下。

JSON Schema 还定义了 anyOf 和更复杂的一些条件选择器,具体的信息可以查询官方文档。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:15:00  更:2022-04-06 23:16:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:51:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码