참고 : http://www.tcpschool.com/json/json_basic_syntax
JSON : JavaScript Object Notation
JSON은 텍스트 기반이므로 어떠한 프로그래밍 언어에서도 JSON 데이터를 읽고 사용할 수 있습니다.
ex)
{
"language": [
{
"name": "HTML",
"category": "web",
"developer": "W3C"
},
{
"name": "CSS",
"category": "web",
"developer": "W3C"
},
{
"name": "Java",
"category": "application",
"developer": "Oracle"
},
{
"name": "Python",
"category": "application",
"developer": "Python"
}
]
}
JSON 데이터는 이름(=Key)과 값(=Value)의 쌍으로 구성
JSON 데이터는 쉼표,
로 나열
객체(object)는 중괄호 {}
로 둘러쌓아 표현
배열(Array)은 대괄호 []
로 둘러쌓아 표현
[+] List In Python
아래와 같은 꼴로 이루어진 것을 JSON 데이터라고 한다.
[+] JSON object안의 JSON 데이터를 Property(=속성)이라고 한다.
"데이터이름" : 값
JSON 객체, 즉 Object는 아래와 같이 이루어진다.
[+] 이름(=Key)과 값(=Value)의 한 쌍으로 이루어진 Property(=속성)들의 정렬되지 않은(순서없음) 집합을 JSON 객체라고 한다.
{
"name" : "식빵",
"family" : "웰시코기",
"age" : 1,
"weight" : 2.14
}
JSON 배열, 즉 Array는 아래와 같이 이루어진다. = 여러개의 데이터가 순서를 가지고 나열된 집합
[!] 객체는 Property들을 순서없이 나열한 것, 즉 객체는 프로퍼티의 집합
배열은 데이터의 값을 순서있게 나열한 것, 즉 배열은 데이터값의 집합
"dog": [
{"name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14},
{"name": "콩콩", "family": "포메라니안", "age": 3, "weight": 2.5},
{"name": "젤리", "family": "푸들", "age": 7, "weight": 3.1}
]
JSON 스키마(schema) : JSON 데이터의 형식을 기술한 문서를 JSON 스키마라고 함.
JSON Schema에서는 위와 같은 검증 기준을 모두 키워드(Keyword)를 이용하여 직접 명시할 수 있습니다.
JSON 스키마에서는 검증 기준을 명시하기 위해 여러 키워드를 사용할 수 있습니다.
이러한 키워드를 사용하여 데이터에 여러 가지 조건을 걸어줄 수 있습니다.
type
: 유효한 데이터의 타입을 명시함properties
: 유효한 데이터 이름과 값의 쌍들을 명시함required
: [!]명시한 배열 의 모든 요소를 프로퍼티로 가지고 있어야만 유효함minimum
: 최솟값 이상의 숫자만 유효함maximum
: 최댓값 이하의 숫자만 유효함multipleOf
: 명시한 숫자의 배수만 유효함maxLength
: 명시한 최대 길이 이하의 문자열만 유효함.minLength
: 명시한 최소 길이 이상의 문자열만 유효함.pattern
: 명시한 정규 표현식 에 해당하는 문자열만 유효함.또한, 스키마에 대한 정보를 나타내는 메타데이터 키워드는 다음과 같음.
ex) JSON Data 및 JSON Schema 예시
{
"dog": {
"name": "식빵",
"family": "웰시코기",
"age": 1,
"weight": 2.14,
"owner": {
"ownerName": "홍길동",
"phone": "01012345678"
}
}
}
{
"title": "강아지 스키마",
"description": "이 스키마는 강아지에 관한 데이터를 검증하기 위해 작성된 스키마임.",
"type": "object",
"properties": {
"name": {"type": "string"},
"family": {"type": "string"},
"age": {"type": "integer"},
"weight": {"type": "number"},
"owner": {
"type": "object",
"properties": {
"ownerName": {"type": "string"},
"phone": {"type": "string"}
}
}
}
}
설명
"dog"
는"object"
, 그리고 Property로는
"name"
,"family"
,"age"
,"weight"
,"owner"
를 가지고 있음
"name"
property의 값(=Value)은"식빵"
과 같은 string 타입이어야
하므로{"type: "string"}
으로 명시...
pattern 키워드를 사용하여 해당 문자열이 명시된 정규 표현식과 일치하는지 검사할 수 있음
[!] 정규 표현식은 추가적으로 학습을 하자.
[+] 정규 표현식(Regular Expression) 참고 : http://www.tcpschool.com/javascript/js_regularExpression_concept
[+] 정규표현식 몇가지
[abc]
: 대괄호 []
안에 명시된 문자를 검색함 ('abc'를 검색함)[a-z]
: 대괄호 []
안에 명시된 범위의 문자를 검색함 ('a'부터 'z'까지의 문자, 즉 알파벳 문자를 검색함)[^a-z]
: 대괄호 []
안에 명시된 범위의 문자를 제외한 문자를 검색함n+
: 앞의 문자(n)이 1번 이상 나타날 경우를 검색함ex) 정규표현식을 이용한 JSON 스키마 검증 예제
{
"type": "string",
"pattern": "[a-z]+"
}
[a-z]+
: 데이터가 1개 이상의 영문 소문자를 가지는 문자열인지 검사
ex1) 객체 검증
{
"type" : "object"
}
[!] 객체 : 이름과 값의 쌍인 property를 갖는 것
따라서 property를 갖는 객체는 검증을 통과, 하지만 123
과 같은 문자열이나 배열 등은 검증을 통과하지 못함.
ex2) 프로퍼티 검증
JSON Schema
{
"type": "object",
"properties": {
"name": {"type": "string"},
"family": {"type": "string"},
"age": {"type": "integer"},
"weight": {"type": "number"}
}
}
검증을 통과하는 JSON 객체
{
"name": "식빵",
"family": "웰시코기",
"age": 1,
"weight": 2.14
}
검증을 통과하지 못하는 JSON 객체
"name": "식빵",
"family": "웰시코기",
"age": "1", # string type!
"weight": "2.14" # string type!
}
ex3) 필수 프로퍼티 검증
{
"type": "object",
"properties": { ... },
"required": ["name", "family"]
}
해당 데이터가 객체이면서, 프로퍼티로 "name"
과 "family"
를 가졌냐를 검사하는 JSON Schema
ex4) 프로퍼티의 개수 검증
{
"type": "object",
"minProperties": 1,
"maxProperties": 2
}
해당 데이터가 객체이면서, 프로퍼티를 1~2개 가졌는지 검사하는 JSON Schema
ex1) 배열 검증
{
"type" : "array"
}
[!] 배열 : 여러개의 데이터가 순서를 가지고 대괄호 []
로 둘러싸인 것 In Python, List
따라서 1, 3.14와 같은 숫자나 객체 등은 위의 검증을 통과하지 못함
ex2) 배열 요소 검증
배열의 요소, 즉 내용, 값들을 검증할 때에는 "itmes"
키워드를 사용한다.
조건 : 배열의 첫번째 요소는 다섯글자 이내로 이루어져있어야하고, 두번째 요소는 숫자 타입, 이 외의 다른 배열 요소가 있으면 안된다.
예를들어["KR001", 69420]
이러한 형태라면 JSON Schema는?
[+] "additionalItems"
키워드의 값을 false로 명시하면, 추가로 다른 배열 요소를 가지는 배열은 검증을 통과히지 못함.
{
"type" : "array",
"items" : [
{"type" : "string",
"maxLength" : 5 },
{"type" : "integer",}
],
"additionalItems" :false
}
ex3) 배열 길이 검증
{
"type" : "array",
"minItems" : 3,
"maxItems" : 10
}
해당 데이터가 배열이면서, 가지고 있는 배열 요소가 3~10개인지 검사하는 JSON Schema
ex4) 중복 값(배열 요소) 검증
{
"type" : "array",
"uniqueItems" : true
}
해당 데이터가 배열이면서, 가지고 있는 배열 요소의 값이 중복되지 않는가를 검사하는 JSON Schema
ex) 열거형 데이터 검증
{
"type" : "string",
"enum" : ["살라", "마네", "조타"]
}
문자열(string)인 "살라", "마네", "조타" 이외의 모든 값은 검증을 통과할 수 없음
"allOf"
: and"anyOf"
: or"oneOf"
: [!]"not"
: not귀찮
귀찮
"oneOf"
키워드를 사용하여 명시된 배열에 나열된 모든 JSON 스키마를 한번에 검사할 수 있음
이때 배열에 나열된 JSON 스키마 중 오직 하나의 스키마 검증을 통과해야 함.
{
"oneOf" : [
{"type": "number", "multipleOf": 3 },
{"type": "number", "multipleOf": 4 }
]
}
해당 데이터가 숫자 타입이면서...
오직 3의 배수이거나
오직 4의 배수여야지 통과함
[!] 그러면 12
는 통과 못하겠네?
"allOf"
또는 "anyOf"
에서는 12
가 통과할듯
"not"
키워드를 사용하여 명시된 JSON 스키마를 만족하지 않는 데이터만을 검사할 수 있습니다. (이거만 아니면 돼~ 느낌)
{
"not": {
"type" : "string"
}
}
해당 데이터가 문자열이 아닌! 데이터만이 검증에 통과함 즉, 모든 문자열은 검증 통과 못함