使用json-schema校验json数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用json-schema校验json数据相关的知识,希望对你有一定的参考价值。
参考技术A 接口接收的json参数(这里只是举个例子):用来校验上面这个json的json-schema(我这里和前端交互,接口信息是写在yapi上,可以直接从yapi里面拷,是yapi根据接口描述自动生成的):
自定义注解:
实现注解具体功能的类:
来自 JSON 或 JSON-Schema 的普通旧 Java 对象
【中文标题】来自 JSON 或 JSON-Schema 的普通旧 Java 对象【英文标题】:Plain Old Java Objects from JSON or JSON-Schema 【发布时间】:2019-06-02 01:07:26 【问题描述】:我有一个 Json 对象,我想在 POJO 中进行转换,问题是他的 1 个属性是一个值 c,它将具有我事先不知道的不同值。假设我对"$key"
一无所知,或者可能是世界各地城市的名称
"data": [
"id": 1,
"name": "theName",
"symbol": "theSymbol",
"last_updated": "2018-06-02T22:51:28.209Z",
"quote":
"$key":
"price": 9283.92,
,
"$key":
"price": 1,
],
"status":
"timestamp": "2018-06-02T22:51:28.209Z",
"error_code": 0,
"error_message": "",
"elapsed": 10,
"credit_count": 1
【问题讨论】:
你能澄清一下“$key”的已知和未知吗? 那部分你必须转换成Map<String,SomeClass>
或类似的东西。
【参考方案1】:
由于“$key”是未知的,我的建议是将quote
转换成Map<String, Map<String, Integer>>
,这样“$key”的值就可以忽略了!这是我的代码:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
public class XmlParser
static class Entity
@JsonProperty("id")
String id;
@JsonProperty("name")
String name;
@JsonProperty("symbol")
String symbol;
@JsonProperty("last_updated")
String lastUpdated;
@JsonProperty("quote")
Map<String, Map<String, Integer>> quote;
static class Data
@JsonProperty("data")
List<Entity> data;
public static void main(String[] args) throws Exception
final String testJson = "\"data\":[\"id\":1,\"name\":\"theName\",\"symbol\":\"theSymbol\",\"last_updated\":\"2018-06-02T22:51:28.209Z\",\"quote\":\"a\":\"price\":9283.92,\"b\":\"price\":1]";
ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue(testJson, Data.class);
System.out.println(mapper.writeValueAsString(data));
【讨论】:
【参考方案2】:您可以将$key
映射到JsonNode
类型的属性。它将有一个有效的 equals/hashCode,因此您可以对其进行比较,将其放入 HashMaps 等中,而无需进一步对其进行数据绑定(JsonNode 直接表示 Json(子)树。)
【讨论】:
【参考方案3】:我会以不同的方式解决这个问题。我会把它变成某种“元对象”,f.ex。像这样:
....
"unknownType":
"name": "$key",
"value1": "9283.92",
"value2": "tttt"
这样你就消除了一层未知信息!您可以尝试将 valueN 字段解析为所有不同类型的值并抛出/捕获解析异常,从而找出正确的类型。
HTH
【讨论】:
以上是关于使用json-schema校验json数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSON-Schema 定义模式并使用 Mongoose?
使用 json-schema 来要求或禁止基于另一个属性值的属性?