티스토리 뷰



1. json-schema-validator란?

 - xml의 DTD 와 유사함.

 - Json 스키마(http://json-schema.org/) 포멧이 유효한지 확인해줌.

 - 웹사이트에서 해당 내용을 테스트해볼 수 있다.(링크)


2. library

 - 기존에 jackson을 많이 사용하므로, fasterxml에서 제공하는 jsonSchema 라이브러리를 사용하려고함.

 1) pom.xml

<dependency>
<groupId>com.github.java-json-tools</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.2.8</version>
</dependency>


3. 간단한 Json 설명

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "/etc/fstab", /* JSON에 대한 제목 */
"description": "JSON representation of /etc/fstab", /* JSON에 대한 설명 */
"type": "object", /* 해당 Json의 최상위 객체 타입, http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.1.1 참고 */
"properties": {
"swap": {
"$ref": "#/definitions/mntent" /* 하단 definitions내용을 참조 합니다. */
}
},
"patternProperties": {
"^/([^/]+(/[^/]+)*)?$": {
"$ref": "#/definitions/mntent"
}
},
"required": /* 필수 값에 대한 속성 정의 */ [
"/",
"swap"
],
"additionalProperties": false,
"definitions": {
"mntent": {
"title": "mntent",
"description": "An fstab entry",
"type": "object", /* 객체 타입 */
"properties": {
"device": {
"type": "string"
},
"fstype": {
"type": "string"
},
"options": {
"type": "array",
"minItems": 1, /* 아이템의 최소 단위 */
"items": {
"type": "string"
}
},
"dump": {
"type": "integer",
"minimum": 0,
"maximum": 0 /* 아이템의 최대 단위 */
},
"fsck": {
"type": "integer",
"minimum": 0
}
},
"required": [
"device",
"fstype"
],
"additionalItems": false
}
}
}



4. 샘플 소스

 1) Basic ( https://github.com/java-json-tools/json-schema-validator/blob/master/src/main/java/com/github/fge/jsonschema/examples/Example1.java)

 - 소스

final String urlPrefix = "https://raw.githubusercontent.com/java-json-tools/json-schema-validator/"
+ "master/src/main/resources/com/github/fge/jsonschema/examples/";

final JsonNode fstabSchema = JsonLoader.fromURL(new URL(urlPrefix + "fstab.json"));
final JsonNode good = JsonLoader.fromURL(new URL(urlPrefix + "fstab-good.json"));
final JsonNode bad = JsonLoader.fromURL(new URL(urlPrefix + "fstab-bad.json"));
final JsonNode bad2 = JsonLoader.fromURL(new URL(urlPrefix + "fstab-bad2.json"));

final JsonSchemaFactory factory = JsonSchemaFactory.byDefault();

final JsonSchema schema = factory.getJsonSchema(fstabSchema);

ProcessingReport report;

report = schema.validate(good); //SUCCESS
print(report);

report = schema.validate(bad); //FAILURE
print(report);

report = schema.validate(bad2); //FAILURE
print(report);

 - 결과


 

 2) message custom(https://github.com/java-json-tools/json-schema-validator/blob/master/src/main/java/com/github/fge/jsonschema/examples/Example8.java)

 - 소스(valid)

final JsonNode customSchema = JsonLoader.fromURL(new URL(URL_PREFIX + "custom-fmt.json"));
final JsonNode good = JsonLoader.fromURL(new URL(URL_PREFIX + "custom-fmt-good.json"));
final JsonNode bad = JsonLoader.fromURL(new URL(URL_PREFIX + "custom-fmt-bad.json"));

//@formatter:off
final Library library = DraftV4Library
.get()
.thaw()
.addFormatAttribute("uuid", UUIDFormatAttribute.getInstance())
.freeze();
//@formatter:on

final String key = "invalidUUID";
final String value = "Not a valid UUID";
final MessageSource source = MapMessageSource.newBuilder().put(key, value).build();
final MessageBundle bundle = MessageBundles.getBundle(JsonSchemaValidationBundle.class).thaw().appendSource(source).freeze();

final ValidationConfiguration cfg = ValidationConfiguration.newBuilder().setDefaultLibrary("http://my.site/myschema#",
library).setValidationMessages(bundle).freeze();

final JsonSchemaFactory factory = JsonSchemaFactory.newBuilder().setValidationConfiguration(cfg).freeze();

final JsonSchema schema = factory.getJsonSchema(customSchema);

ProcessingReport report;

report = schema.validate(good);
print(report);

report = schema.validate(bad);
print(report);


  - 소스(UUIDFormatAttribute)

private static class UUIDFormatAttribute extends AbstractFormatAttribute {
private static FormatAttribute INSTANCE = new UUIDFormatAttribute();

private UUIDFormatAttribute() {
super("uuid", NodeType.STRING);
}

public static FormatAttribute getInstance() {
return INSTANCE;
}

@Override
public void validate(final ProcessingReport report, final MessageBundle bundle, final FullData data) throws ProcessingException {
final String value = data.getInstance().getNode().textValue();
try {
UUID.fromString(value);

} catch (IllegalArgumentException ignored) {
report.error(super.newMsg(data, bundle, "invalidUUID").put("input", value));
}
}
}

  - 결과


5. 전체소스



 * 참고링크

  - https://github.com/java-json-tools/json-schema-validator

  - http://json-schema.org/latest/json-schema-validation.html

  - http://json-schema-validator.herokuapp.com/

  - http://json-schema.org/example2.html

'프로그래밍 > JAVA' 카테고리의 다른 글

AmazonS3Client, deprecated!!!  (0) 2018.05.21
json schema validator 사용하기 - 01  (0) 2018.04.18
시스템 종료 후 File 삭제  (0) 2018.04.12
Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
15,729
Today
3
Yesterday
72
«   2018/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함