1. 개요
JSON 스키마는 JSON 객체 의 형식과 구조를 검증하기 위한 선언적 언어입니다. 유효한 JSON 개체가 어떻게 생겼는지정확히 설명하기 위해 특수 프리미티브의 수를 지정할 수 있습니다
JSON 스키마 사양은 세 부분으로 나뉩니다.
- JSON 스키마 코어 : JSON 스키마 코어 사양은 스키마에 대한 용어가 정의되는 곳입니다.
- JSON 스키마 유효성 검사 : JSON 스키마 유효성 검사 사양은 유효성 검사 제약 조건을 정의하는 유효한 방법을 정의하는 문서입니다. 이 문서는 또한 JSON API에 대한 유효성 검사를 지정하는 데 사용할 수 있는 키워드 세트를 정의합니다. 다음 예에서는 이러한 키워드 중 일부를 사용합니다.
- JSON Hyper-Schema : 하이퍼링크 및 하이퍼미디어 관련 키워드가 정의된 JSON 스키마 사양의 또 다른 확장입니다.
2. JSON 스키마 정의
이제 JSON 스키마가 무엇에 사용되는지 정의했으므로 JSON 개체 와 이를 설명하는 해당 JSON 스키마를 만들어 보겠습니다 .
다음은 제품 카탈로그를 나타내는 간단한 JSON 개체 입니다.
{
"id": 1,
"name": "Lampshade",
"price": 0
}
다음과 같이 JSON 스키마를 정의할 수 있습니다 .
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product",
"description": "A product from the catalog",
"type": "object",
"properties": {
"id": {
"description": "The unique identifier for a product",
"type": "integer"
},
"name": {
"description": "Name of the product",
"type": "string"
},
"price": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true
}
},
"required": ["id", "name", "price"]
}
보시다시피 JSON 스키마 는 JSON 문서 이며 해당 문서는 객체여야 합니다. JSON 스키마 에 의해 정의된 객체 멤버(또는 속성)를 키워드라고 합니다 .
샘플에서 사용한 키워드를 설명하겠습니다.
- $ schema 키워드는 이 스키마가 초안 v4 사양에 따라 작성되었음을 나타냅니다.
- 제목 및 설명 키워드는 검증 중인 데이터에 제약 조건을 추가하지 않는다는 점에서 설명적일 뿐입니다 . 스키마의 의도는 다음 두 키워드로 설명됩니다. 제품을 설명합니다.
- type 키워드는 JSON 데이터 에 대한 첫 번째 제약 조건을 정의합니다 . JSON Object 여야 합니다 .
또한 JSON 스키마는 스키마 키워드가 아닌 속성을 포함할 수 있습니다(MAY). 우리의 경우 id , name , price 는 JSON Object 의 멤버(또는 속성)가 됩니다 .
각 속성에 대해 유형을 정의할 수 있습니다 . 우리는 id 와 name을 string 으로 , price를 number 로 정의했습니다 . JSON 스키마 에서 숫자는 최소값을 가질 수 있습니다. 기본적으로 이 최소값은 포괄적이므로 exclusiveMinimum 을 지정해야 합니다 .
마지막으로 스키마는 id , name 및 price 가 필수 임을 알려줍니다 .
3. JSON 스키마로 검증
JSON 스키마를 배치하면 JSON 객체 의 유효성을 검사할 수 있습니다 .
이 작업을 수행하기 위한 많은 라이브러리가 있습니다 . 이 예에서는 Java json-schema 라이브러리를 선택했습니다 .
먼저 pom.xml 에 다음 의존성을 추가해야 합니다 .
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.0.72</version>
</dependency>
마지막으로 JSON 개체의 유효성을 검사하기 위해 몇 가지 간단한 테스트 사례를 작성할 수 있습니다 .
@Test
public void givenInvalidInput_whenValidating_thenInvalid() throws IOException {
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
JsonSchema jsonSchema = factory.getSchema(
JSONSchemaUnitTest.class.getResourceAsStream("/schema.json"));
JsonNode jsonNode = mapper.readTree(
JSONSchemaUnitTest.class.getResourceAsStream("/product_invalid.json"));
Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
assertThat(errors).isNotEmpty().asString().contains("price: must have a minimum value of 0");
}
이 경우 유효성 검사 오류가 수신됩니다.
두 번째 테스트는 다음과 같습니다.
@Test
public void givenValidInput_whenValidating_thenValid() throws ValidationException {
JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
JsonSchema jsonSchema = factory.getSchema(
JSONSchemaUnitTest.class.getResourceAsStream("/schema.json"));
JsonNode jsonNode = mapper.readTree(
JSONSchemaUnitTest.class.getResourceAsStream("/product_valid.json"));
Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
assertThat(errors).isEmpty();
}
유효한 JSON 객체를 사용하므로 유효성 검사 오류가 발생하지 않습니다.
4. 결론
이 기사에서는 JSON 스키마가 무엇이며 스키마를 정의하는 데 도움이 되는 몇 가지 관련 키워드가 무엇인지 정의했습니다 .
JSON 스키마를 해당 JSON 개체 표현과 결합하면 몇 가지 유효성 검사 작업을 수행할 수 있습니다.
이 기사의 간단한 테스트 사례는 GitHub 프로젝트 에서 찾을 수 있습니다 .