javascript
使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON
使用阿里巴巴json映射
在本文中,我們將探討在創(chuàng)建和共享API時(shí)出現(xiàn)的問(wèn)題。 特別是,需要:
- 表達(dá)數(shù)據(jù)的結(jié)構(gòu)
- 提供對(duì)該數(shù)據(jù)的驗(yàn)證
- 允許將來(lái)改變主意
- 通過(guò)您擁有的部分?jǐn)?shù)據(jù)與客戶進(jìn)行溝通
- 缺少數(shù)據(jù)時(shí)填寫(xiě)空白
人們通常使用版本編號(hào)的API解決此問(wèn)題。 API的每個(gè)版本都綁定到一個(gè)架構(gòu)。 模式通常以JSON模式格式表示。
上述支持庫(kù)不支持在同一模式的多個(gè)版本之間進(jìn)行轉(zhuǎn)換。
Apache Avro可以很好地支持模式演化。 Avro可以使用類似于JSON Schema的方式定義其架構(gòu),并且能夠讀取和寫(xiě)入JSON,但是如果您通過(guò)JSON中的聯(lián)合類型使用可空字段,則需要JSON2AvroConverter來(lái)讀取外觀正常的JSON。
但是,Avro并不擅長(zhǎng)讀取缺少字段的JSON。
JSON Schema的草案7支持默認(rèn)值, everit json-schema庫(kù)可以在驗(yàn)證時(shí)將默認(rèn)值替換為對(duì)象。
放在一起
比方說(shuō):
- 我有一個(gè)模式,可以為任何非強(qiáng)制性內(nèi)容提供默認(rèn)值
- 我有一個(gè)規(guī)則,那就是架構(gòu)的未來(lái)版本都不能添加強(qiáng)制性的內(nèi)容
- 我有具有給定字段的數(shù)據(jù),無(wú)論特定版本的架構(gòu)是否需要它們
- 我希望返回對(duì)特定模式版本有效的數(shù)據(jù)
我將需要:
- 篩選出源中而不是架構(gòu)中的字段
- 當(dāng)字段在模式中但不在數(shù)據(jù)中時(shí),添加默認(rèn)值
以上所有內(nèi)容均在GitHub的POC中進(jìn)行了探討 。
POC
POC使用everit庫(kù)填充默認(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),可用于對(duì)模式和輸入JSON進(jìn)行迭代,從而刪除模式中未知的JSON字段。 這是很基本的原因,因?yàn)樗鼰o(wú)法處理JSON模式中可能出現(xiàn)的邊緣情況,并且不能容忍輸入JSON中的數(shù)據(jù)類型與模式所描述的類型不同。
也就是說(shuō),它已經(jīng)通過(guò)了一些有用的測(cè)試,因此絕對(duì)是將來(lái)進(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)建塊。 如果在正確的庫(kù)中使用它,可以在驗(yàn)證期間使用它提供默認(rèn)值的能力之上,將其強(qiáng)制用作過(guò)濾器。
我希望這里的POC代碼對(duì)某人有用。
翻譯自: https://www.javacodegeeks.com/2020/02/using-json-schema-validation-to-map-sparse-json.html
使用阿里巴巴json映射
總結(jié)
以上是生活随笔為你收集整理的使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用互联网了解的两个月里_我两个月来对Q
- 下一篇: ai怎么做简单logo(AI怎么做简单纹