Java에서는 JSON, 즉 JavaScript Object Notation이 서버 측 응답을 조작하는 데 매우 중요한 역할을 합니다. Java에서는 JSON 스키마에 대해 JSON 문서의 유효성을 검사할 수 있습니다. 검증을 수행하기 위해 우리는 networknt JSON 스키마 유효성 검사기 도서관.
이 라이브러리를 사용하는 이유는 Jackson을 JSON 라이브러리로 사용하며 최신 JSON Schema 버전을 지원하기 때문입니다. networknt 라이브러리는 자바 JSON 스키마 유효성 검사를 위한 JSON Schema Core Draft v4, v6, v7 및 v2019-09(예제에서 사용) 사양을 구현합니다. 기본 JSON 파서로 Jackson이 있습니다.
먼저 프로그램에서 유효성 검사를 수행하는 데 사용하는 JSON 문서와 JSON 스키마의 예를 들어 보겠습니다.
JSON 문서
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
JSON 스키마
{ '$schema': 'https://json-schema.org/draft/2019-09/schema#', '$id+': 'http://my-paintings-api.com/schemas/painting-schema.json', 'type': 'object', 'title': 'Painting', 'description': 'Painting information', 'additionalProperties': true, 'required': ['name', 'artist', 'description', 'tags'], 'properties': { 'name': { 'type': 'string', 'description': 'Painting name' }, 'artist': { 'type': 'string', 'maxLength': 50, 'description': 'Name of the artist' }, 'description': { 'type': ['string', 'null'], 'description': 'Painting description' }, 'tags': { 'type': 'array', 'items': { '$ref': '#/$defs/tag' } } }, '$defs': { 'tag': { 'type': 'string', 'enum': ['oil', 'watercolor', 'digital', 'famous'] } } }
pom.xml 파일에 다음 종속성을 추가합니다.
com.networknt json-schema-validator 1.0.42
우리는 또한 org.everit.json JSON 개체의 유효성을 검사하기 위한 라이브러리입니다. 이를 사용하려면 pom.xml 파일에 다음 종속성을 추가해야 합니다.
org.everit.json org.everit.json.schema 1.11.1
우리의 경우에는 네트워크 자바 라이브러리.
JSON 문서의 유효성을 검사하려면 다음 단계를 사용합니다.
- 새로운 메이븐 프로젝트를 생성합니다.
- pom.xml 파일에 JSON 스키마 유효성 검사기 종속성을 추가합니다.
- ObjectMapper를 사용하여 JSON 문서에서 데이터와 스키마를 읽습니다.
- JsonSchemaFactory의 verify() 메서드를 사용하여 JSON 문서의 유효성을 검사합니다.
- 반환된 결과를 검증 세트에 저장하고 화면에 인쇄합니다.
이제 모든 것이 설정되었으므로 JSON 문서의 유효성을 검사하는 실제 코드를 구현할 수 있습니다.
JsonValidatorExample.java
//import required classes and packages package javaTpoint.ObjectToJsonConversion; import java.io.InputStream; import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; import com.networknt.schema.ValidationMessage; // create class to validate JSON document public class JsonValidatorExample { // create inputStreamFromClasspath() method to load the JSON data from the class path private static InputStream inputStreamFromClasspath( String path ) { // returning stream return Thread.currentThread().getContextClassLoader().getResourceAsStream( path ); } // main() method start public static void main( String[] args ) throws Exception { // create instance of the ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // create an instance of the JsonSchemaFactory using version flag JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance( SpecVersion.VersionFlag.V201909 ); // store the JSON data in InputStream try( InputStream jsonStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\data.json' ); InputStream schemaStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\schema.json' ) ){ // read data from the stream and store it into JsonNode JsonNode json = objectMapper.readTree(jsonStream); // get schema from the schemaStream and store it into JsonSchema JsonSchema schema = schemaFactory.getSchema(schemaStream); // create set of validation message and store result in it Set validationResult = schema.validate( json ); // show the validation errors if (validationResult.isEmpty()) { // show custom message if there is no validation error System.out.println( 'There is no validation errors' ); } else { // show all the validation error validationResult.forEach(vm -> System.out.println(vm.getMessage())); } } } }
설명
위의 코드에서는 버전플래그 . 얻기 위해서는 JsonSchemaFactory , 생성자에 해당 버전 플래그를 전달해야 합니다. 우리의 경우에는 2019-09 JSON 스키마 버전.
또한 사용자 정의 도우미 메서드(예: inputStreamFromClasspath())를 사용하여 클래스 경로에서 두 파일을 모두 로드합니다. InputStream에서 JSON 데이터를 읽기 위해 Jackson ObjectMapper 클래스의 인스턴스를 만듭니다. 그런 다음 해당 InputStream 데이터를 JsonNode 객체로 구문 분석합니다. JsonSchemaFactory의 인스턴스를 사용하여 JsonNode의 유효성을 검사하기 위한 JsonSchema 객체를 얻습니다. 하나 이상의 ValidationMessage 개체를 포함하는 일련의 유효성 검사 오류를 만듭니다. 검증 오류가 없으면 검증 세트는 비어 있게 됩니다.
산출