Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengesahkan sama ada format json memenuhi keperluan dalam java

Bagaimana untuk mengesahkan sama ada format json memenuhi keperluan dalam java

WBOY
WBOYke hadapan
2023-05-15 16:01:163822semak imbas

Skema JSON

Skema JSON ialah alat yang berkuasa untuk mengesahkan struktur data JSON boleh difahami sebagai corak atau peraturan.

Skema Json mentakrifkan satu set perbendaharaan kata dan peraturan, yang digunakan untuk mentakrifkan metadata Json, dan metadata juga dinyatakan dalam bentuk data Json. Metadata Json mentakrifkan spesifikasi yang perlu dipenuhi oleh data Json. Spesifikasi termasuk ahli, struktur, jenis, kekangan, dsb.

Skema JSON ialah perihalan format, definisi dan templat json Dengannya, anda boleh menjana sebarang data json yang memenuhi keperluan

json-schema-validator

.

Dalam Java, json-schema-validator digunakan untuk mengesahkan format data json. diperkenalkan , mereka

perlu

2 Tulis skema

jackson-coreJika format data yang ingin kami sahkan adalah seperti berikut: jackson-core

        <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>
json-schema-validatorDi luar adalah jenis dan data. , dan bahagian dalamnya ialah Array, atribut tatasusunan termasuk jantina, nama, umur

Tulis fail skema

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

Json di atas menerangkan format data json sasaran Lapisan luar mesti mempunyai medan jenis dan data, yang mengehadkan nama maksimum Panjang

ialah 3, jantina ialah nilai penghitungan dan hanya boleh mengambil dua rentetan lelaki dan perempuan, dan umur ialah nombor jenis.

3. Pelaksanaan kod

{
    "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"
    ]
}

Kod di atas mula-mula mendapatkan fail standard

json untuk disahkan, dan kemudian memanggil kaedah maxLength untuk mengesahkan json masuk Di sini

bermaksud pemeriksaan mendalam Tanpa parameter ini, ralat pertama yang ditemui semasa mengesahkan json akan dikembalikan secara langsung

Seterusnya, bina kaedah ujian

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;
    }
validator.json4 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true)true{jantina=nilai medan jantina salah, tidak diketahui tidak berada dalam julat penghitungan, nama=Wang Xiaoming1 panjang medan terlalu panjang, umur=ralat jenis umur, jenis sedia ada: rentetan, jenis jangkaan :["integer ","number"]}

5. Ringkasan

Jika skema ditulis menggunakan kurungan segi empat sama
untuk senarai, maka apabila mengesahkan Hanya sekeping data pertama dalam tatasusunan akan disemak, yang merupakan perangkap, seperti yang ditunjukkan di bawah

    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);
    }

Jika ini berlaku, hanya sekeping data pertama dalam tatasusunan data akan disemak,
yang lain mungkin mempunyai ralat Tiada ralat akan dilaporkan! !

Atas ialah kandungan terperinci Bagaimana untuk mengesahkan sama ada format json memenuhi keperluan dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam