Maison  >  Article  >  Java  >  Comment vérifier si le format de json répond aux exigences en Java

Comment vérifier si le format de json répond aux exigences en Java

WBOY
WBOYavant
2023-05-15 16:01:164060parcourir

JSON Schema

JSON Schema est un outil puissant pour valider la structure de données JSON. Le schéma peut être compris comme un modèle ou une règle.

Json Schema définit un ensemble de vocabulaire et de règles, qui sont utilisés pour définir les métadonnées Json, et les métadonnées sont également exprimées sous la forme de données Json. Les métadonnées Json définissent les spécifications auxquelles les données Json doivent répondre. Les spécifications incluent les membres, les structures, les types, les contraintes, etc.

JSON Schema est la description du format, la définition et le modèle de json. Avec lui, vous pouvez générer toutes les données json qui répondent aux exigences

json-schema-validator

En Java, pour vérifier le format de données json, utilisez. json-schema-validator, des exemples spécifiques sont les suivants : json-schema-validator,具体实例如下:

1. 引入依赖

        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>2.2.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.3.0</version>
        </dependency>

jackson-corejackson-core 是必须要引入的,他们为 json-schema-validator 必须的

2. 编写schema

如果我们要校验的数据格式如下:

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

外面是type和data,里面是一个数组,数组属性包括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描述了目标json的数据格式,外层必须字段type、data,里面限制了name的最大长度 maxLength 为3,sex 为枚举值,只可取 男、女两个字符串,age 为number类型。

3. 代码实现

public Map validatorJsonUnchecked(String body) {
        Map<String, String> 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 + " 字段缺失");
                        });
                        // 如果字段超长
                    } 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 + " 字段长度过长");
                        // 如果不在枚举范围内
                    } 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 + "字段值错误," + value + "不在枚举范围内");
                    } 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 + " 类型错误,现有类型: " + found + ", 预期类型:" + expected);
                    }
                });
            }
        } catch (IOException | ProcessingException e) {
            log.error("校验json格式异常", e);
        }
        return map;
    }

以上代码首先获取了 要校验的json的标准文件 validator.json,然后调用 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true) 方法对传进来的json 进行了校验,这里 true 的意思是深度检查,如果没有这个参数,校验json的时候遇到第一个错误,就直接返回了

接下来构建测试方法

    public static void main(String[] args) {
        ValidatorService validatorService = new ValidatorServiceImpl();
        Map<String, Object> body = new HashMap<>();
        HashMap<String, Object> one = new HashMap<String, Object>() {{
            put("name", "王小明");
            put("sex", "男");
            put("age", 18);
        }};
        HashMap<String, Object> two = new HashMap<String, Object>() {{
            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. 执行结果

{sex=sex字段值错误,未知不在枚举范围内, name=王小明1 字段长度过长, age=age 类型错误,现有类型: string, 预期类型:["integer","number"]}

5. 整理总结

如果schema 编写的时候,对列表使用了中括号 []

1. Introduire les dépendances

{
    "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"
    ]
}
jackson-core et jackson-core. doit être introduit, ils sont nécessaires pour json-schema-validator

2 Écrire le schéma

Si le format de données que nous voulons vérifier est le suivant : . rrreeeÀ l'extérieur Il s'agit du type et des données, qui sont un tableau. Les attributs du tableau incluent le sexe, le nom, l'âge🎜🎜Écrit un fichier de schéma🎜rrreee🎜Le json ci-dessus décrit le format de données du json cible. La couche externe doit avoir le type de champs. et data, et le nom maximum est limité à l'intérieur. La longueur maxLength est de 3, le sexe est une valeur d'énumération et ne peut prendre que deux chaînes mâle et femelle, et l'âge est de type numéro. 🎜

3. Implémentation du code

rrreee🎜Le code ci-dessus obtient d'abord le fichier standard validator.json du json à vérifier, puis appelle JsonSchemaFactory.byDefault() .getValidator La méthode ().validate(jsonNodeSchema, jsonNode, true) vérifie le json entrant. Ici, true signifie une inspection approfondie. S'il n'y a pas de tel paramètre, vérifiez le json. Lorsqu'il rencontre la première erreur, il est renvoyé directement🎜🎜Ensuite, construisez la méthode de test🎜rrreee

4 Résultat de l'exécution

🎜🎜{sex=la valeur du champ sexe est incorrecte, inconnue n'est pas dans la plage d'énumération, nom =. Wang Xiaoming1 La longueur du champ est trop longue, âge=erreur de type âge, type existant : chaîne, type attendu : ["integer", "number"]}🎜🎜

5. Lorsque vous utilisez des crochets [] pour la liste, alors seul le premier du tableau sera vérifié lors de la vérification. C'est un piège, comme suit🎜rrreee🎜Si tel est le cas, seul le premier. élément de données dans le tableau de données sera vérifié 🎜 S'il y a d'autres erreurs, aucune erreur ne sera signalée ! ! 🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer