javascript
使用JSON模式验证来映射稀疏JSON
在本文中,我們將介紹創(chuàng)建和共享API時(shí)出現(xiàn)的問題。 特別是,需要:
- 表達(dá)數(shù)據(jù)的結(jié)構(gòu)
- 提供對(duì)該數(shù)據(jù)的驗(yàn)證
- 允許將來改變主意
- 通過您擁有的部分?jǐn)?shù)據(jù)與客戶進(jìn)行溝通
- 缺少數(shù)據(jù)時(shí)填寫空白
人們通常使用版本編號(hào)的API解決此問題。 API的每個(gè)版本都綁定到一個(gè)架構(gòu)。 模式通常以JSON模式格式表示。
上述支持庫不支持在同一模式的多個(gè)版本之間進(jìn)行轉(zhuǎn)換。
Apache Avro可以很好地支持模式演化。 Avro可以使用類似于JSON Schema的方式定義其架構(gòu),并且能夠讀取和寫入JSON,但是如果您通過JSON中的聯(lián)合類型使用可空字段,則需要JSON2AvroConverter來讀取外觀正常的JSON。
但是,Avro并不擅長(zhǎng)讀取缺少字段的JSON。
JSON Schema的草案7支持默認(rèn)值, everit json-schema庫可以在驗(yàn)證時(shí)將默認(rèn)值替換為對(duì)象。
放在一起
比方說:
- 我有一個(gè)模式,可以為任何非強(qiáng)制性內(nèi)容提供默認(rèn)值
- 我有一個(gè)規(guī)則,那就是架構(gòu)的未來版本都不能添加強(qiáng)制性的內(nèi)容
- 我有具有給定字段的數(shù)據(jù),無論特定版本的架構(gòu)是否需要它們
- 我希望返回對(duì)特定模式版本有效的數(shù)據(jù)
我將需要:
- 篩選出源中而不是架構(gòu)中的字段
- 當(dāng)字段在模式中但不在數(shù)據(jù)中時(shí),添加默認(rèn)值
以上所有內(nèi)容均在GitHub的此POC中進(jìn)行了探討 。
POC
POC使用everit庫填充默認(rèn)值,并演示如何在模式中表達(dá)默認(rèn)值。
在Java代碼中表達(dá)JSON有點(diǎn)煩人,所以最好的辦法是提取模式的測(cè)試并在JSONEditorOnline之類的工具中進(jìn)行探索 。 (希望您的IDE在復(fù)制和粘貼時(shí)會(huì)取消轉(zhuǎn)義"字符-IntelliJ會(huì)。)
POC具有基本的實(shí)現(xiàn),可以在模式和輸入JSON上進(jìn)行迭代,從而刪除模式中不知道的JSON字段。 這是很基本的原因,因?yàn)樗鼰o法處理JSON模式中可能出現(xiàn)的邊緣情況,并且不能容忍輸入JSON中的數(shù)據(jù)類型與模式描述的數(shù)據(jù)類型不同。
也就是說,它已經(jīng)通過了一些有用的測(cè)試,因此絕對(duì)是將來進(jìn)行調(diào)查的起點(diǎn)。
結(jié)論
模式演化可以非常精確地完成。 Apache Avro允許對(duì)同一模式的多個(gè)版本進(jìn)行建模,加載一個(gè)版本并轉(zhuǎn)換為另一個(gè)版本,但這不是JSON的好朋友,并且要求源JSON必須采用正確的格式以用于其中一個(gè)模式。
JSON模式是REST API定義的基本構(gòu)建塊。 如果在正確的庫中使用它,可以在驗(yàn)證期間使用它提供默認(rèn)值的能力之上,將其強(qiáng)制用作過濾器。
我希望這里的POC代碼對(duì)某人有用。
翻譯自: https://www.javacodegeeks.com/2020/02/using-json-schema-validation-to-map-sparse-json.html
總結(jié)
以上是生活随笔為你收集整理的使用JSON模式验证来映射稀疏JSON的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去备案改色膜被发现改了排气(去备案改色)
- 下一篇: Angular 8 + Spring B