真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java如何校驗(yàn)json的格式

這篇文章主要介紹“java如何校驗(yàn)json的格式”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“java如何校驗(yàn)json的格式”文章能幫助大家解決問(wèn)題。

創(chuàng)新互聯(lián)專業(yè)成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)布平臺(tái)等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

JSON Schema

JSON Schema 是用于驗(yàn)證 JSON 數(shù)據(jù)結(jié)構(gòu)的強(qiáng)大工具,Schema可以理解為模式或者規(guī)則。

Json Schema定義了一套詞匯和規(guī)則,這套詞匯和規(guī)則用來(lái)定義Json元數(shù)據(jù),且元數(shù)據(jù)也是通過(guò)Json數(shù)據(jù)形式表達(dá)的。Json元數(shù)據(jù)定義了Json數(shù)據(jù)需要滿足的規(guī)范,規(guī)范包括成員、結(jié)構(gòu)、類型、約束等。

JSON Schema 就是json的格式描述、定義、模板,有了他就可以生成任何符合要求的json數(shù)據(jù)

json-schema-validator

在java中,對(duì)json數(shù)據(jù)格式的校驗(yàn),使用 json-schema-validator,具體實(shí)例如下:

1. 引入依賴
        
            com.github.fge
            json-schema-validator
            2.2.6
        

        
            com.fasterxml.jackson.core
            jackson-core
            2.3.0
        
        
            com.fasterxml.jackson.core
            jackson-core
            2.3.0
        

jackson-corejackson-core 是必須要引入的,他們?yōu)?json-schema-validator 必須的

2. 編寫schema

如果我們要校驗(yàn)的數(shù)據(jù)格式如下:

{
    "data": [
        {
            "sex": "男",
            "name": "王小明",
            "age": 18
        },
        {
            "sex": "女",
            "name": "王小紅",
            "age": 17
        }
    ],
    "type": "human"
}

外面是type和data,里面是一個(gè)數(shù)組,數(shù)組屬性包括sex、name、age

編寫schema文件

{
    "type": "object",
    "properties": {
        "type": {
            "type": "string"
        },
        "data": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 3
                    },
                    "sex": {
                        "enum": [
                            "男",
                            "女"
                        ]
                    },
                    "age": {
                        "type": "number"
                    }
                },
                "required": [
                    "name",
                    "sex",
                    "age"
                ]
            }
        }
    },
    "required": [
        "type",
        "data"
    ]
}

以上json描述了目標(biāo)json的數(shù)據(jù)格式,外層必須字段type、data,里面限制了name的最大長(zhǎng)度 maxLength 為3,sex 為枚舉值,只可取 男、女兩個(gè)字符串,age 為number類型。

3. 代碼實(shí)現(xiàn)
public Map validatorJsonUnchecked(String body) {
        Map map = new HashMap<>();
        String filePath = "validator" + File.separator + "validator.json";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            JsonNode jsonNodeSchema = objectMapper.readTree(ResourceUtil.readUtf8Str(filePath));
            JsonNode jsonNode = objectMapper.readTree(body);
            ProcessingReport processingReport = JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true);
            if (!processingReport.isSuccess()) {
                processingReport.forEach(processingMessage -> {
                    JsonNode missing = processingMessage.asJson().get("missing");
                    String keyword = processingMessage.asJson().get("keyword").asText();
                    // 如果缺失字段
                    if (!Objects.isNull(missing)) {
                        missing.forEach(miss -> {
                            String text = miss.asText();
                            map.put(text, text + " 字段缺失");
                        });
                        // 如果字段超長(zhǎng)
                    } else if ("maxLength".equals(keyword)) {
                        String field = processingMessage.asJson().get("instance").get("pointer").asText();
                        String value = processingMessage.asJson().get("value").asText();
                        field = field.substring(field.lastIndexOf("/") + 1);
                        map.put(field, value + " 字段長(zhǎng)度過(guò)長(zhǎng)");
                        // 如果不在枚舉范圍內(nèi)
                    } else if ("enum".equals(keyword)) {
                        String field = processingMessage.asJson().get("instance").get("pointer").asText();
                        String value = processingMessage.asJson().get("value").asText();
                        field = field.substring(field.lastIndexOf("/") + 1);
                        map.put(field, field + "字段值錯(cuò)誤," + value + "不在枚舉范圍內(nèi)");
                    } else if ("type".equals(keyword)) {
                        String field = processingMessage.asJson().get("instance").get("pointer").asText();
                        String found = processingMessage.asJson().get("found").asText();
                        String expected = processingMessage.asJson().get("expected").toString();
                        field = field.substring(field.lastIndexOf("/") + 1);
                        map.put(field, field + " 類型錯(cuò)誤,現(xiàn)有類型: " + found + ", 預(yù)期類型:" + expected);
                    }
                });
            }
        } catch (IOException | ProcessingException e) {
            log.error("校驗(yàn)json格式異常", e);
        }
        return map;
    }

以上代碼首先獲取了 要校驗(yàn)的json的標(biāo)準(zhǔn)文件 validator.json,然后調(diào)用 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true) 方法對(duì)傳進(jìn)來(lái)的json 進(jìn)行了校驗(yàn),這里 true 的意思是深度檢查,如果沒(méi)有這個(gè)參數(shù),校驗(yàn)json的時(shí)候遇到第一個(gè)錯(cuò)誤,就直接返回了

接下來(lái)構(gòu)建測(cè)試方法

    public static void main(String[] args) {
        ValidatorService validatorService = new ValidatorServiceImpl();
        Map body = new HashMap<>();
        HashMap one = new HashMap() {{
            put("name", "王小明");
            put("sex", "男");
            put("age", 18);
        }};
        HashMap two = new HashMap() {{
            put("name", "王小明1");
            put("sex", "未知");
            put("age", "18");
        }};
        body.put("type", "human");
        body.put("data", Arrays.asList(one,two));

        Map map = validatorService.validatorJsonUnchecked(JSONUtil.toJsonStr(body));
        System.out.println(map);
    }
4. 執(zhí)行結(jié)果

{sex=sex字段值錯(cuò)誤,未知不在枚舉范圍內(nèi), name=王小明1 字段長(zhǎng)度過(guò)長(zhǎng), age=age 類型錯(cuò)誤,現(xiàn)有類型: string, 預(yù)期類型:["integer","number"]}

5. 整理總結(jié)

如果schema 編寫的時(shí)候,對(duì)列表使用了中括號(hào) [],那么當(dāng)校驗(yàn)的時(shí)候只會(huì)校驗(yàn)數(shù)組中的第一個(gè),這是一個(gè)坑,如下

{
    "type": "object",
    "properties": {
        "type": {
            "type": "string"
        },
        "data": {
            "type": "array",
            "items": [
                {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string",
                            "maxLength": 3
                        },
                        "sex": {
                            "enum": [
                                "男",
                                "女"
                            ]
                        },
                        "age": {
                            "type": "number"
                        }
                    },
                    "required": [
                        "name",
                        "sex",
                        "age"
                    ]
                }
            ]
        }
    },
    "required": [
        "type",
        "data"
    ]
}

如果是這樣的話,只會(huì)校驗(yàn) data 數(shù)組的第一條數(shù)據(jù),其他的有錯(cuò)誤也不會(huì)報(bào)錯(cuò)??!

關(guān)于“java如何校驗(yàn)json的格式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。


當(dāng)前文章:java如何校驗(yàn)json的格式
當(dāng)前路徑:http://weahome.cn/article/gepdeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部