使用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实际运用

json schema实际运用

使用 JSON-Schema 定义模式并使用 Mongoose?

使用 json-schema 来要求或禁止基于另一个属性值的属性?

对于 json-schema,我如何为 json 声明一个类型

如何从 Swagger API 声明生成 JSON-Schema