使用JSON模式验证来映射稀疏JSON

在本文中,我们将介绍创建和共享API时出现的问题。 特别是,需要:

  • 表达数据的结构
  • 提供对该数据的验证
  • 允许将来改变主意
  • 通过您拥有的部分数据与客户进行沟通
  • 缺少数据时填写空白

人们通常使用版本编号的API解决此问题。 API的每个版本都绑定到一个架构。 模式通常以JSON模式格式表示。

上述支持库不支持在同一模式的多个版本之间进行转换。

Apache Avro可以很好地支持模式演化。 Avro可以使用类似于JSON Schema的方式定义其架构,并且能够读取和写入JSON,但是如果您通过JSON中的联合类型使用可空字段,则需要JSON2AvroConverter来读取外观正常的JSON。

但是,Avro并不擅长读取缺少字段的JSON。

JSON Schema的草案7支持默认值, everit json-schema库可以在验证时将默认值替换为对象。

放在一起

比方说:

  • 我有一个模式,可以为任何非强制性内容提供默认值
  • 我有一个规则,那就是架构的未来版本都不能添加强制性的内容
  • 我有具有给定字段的数据,无论特定版本的架构是否需要它们
  • 我希望返回对特定模式版本有效的数据

我将需要:

  • 筛选出源中而不是架构中的字段
  • 当字段在模式中但不在数据中时,添加默认值

以上所有内容均在GitHub的此POC中进行了探讨

POC

POC使用everit库填充默认值,并演示如何在模式中表达默认值。

在Java代码中表达JSON有点烦人,所以最好的办法是提取模式的测试并在JSONEditorOnline之类的工具中进行探索 。 (希望您的IDE在复制和粘贴时会取消转义"字符-IntelliJ会。)

POC具有基本的实现,可以在模式和输入JSON上进行迭代,从而删除模式中不知道的JSON字段。 这是很基本的原因,因为它无法处理JSON模式中可能出现的边缘情况,并且不能容忍输入JSON中的数据类型与模式描述的数据类型不同。

也就是说,它已经通过了一些有用的测试,因此绝对是将来进行调查的起点。

结论

模式演化可以非常精确地完成。 Apache Avro允许对同一模式的多个版本进行建模,加载一个版本并转换为另一个版本,但这不是JSON的好朋友,并且要求源JSON必须采用正确的格式以用于其中一个模式。

JSON模式是REST API定义的基本构建块。 如果在正确的库中使用它,可以在验证期间使用它提供默认值的能力之上,将其强制用作过滤器。

我希望这里的POC代码对某人有用。

翻译自: https://www.javacodegeeks.com/2020/02/using-json-schema-validation-to-map-sparse-json.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值