JSON

olxtar·2022년 4월 26일
0

JSON Study

목록 보기
1/3
post-thumbnail

참고 : http://www.tcpschool.com/json/json_basic_syntax




01. JSON 개요

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




02. JSON 구조

  1. JSON 데이터는 이름(=Key)(=Value)의 쌍으로 구성

  2. JSON 데이터는 쉼표,로 나열

  3. 객체(object)는 중괄호 {}로 둘러쌓아 표현

  4. 배열(Array)은 대괄호 []로 둘러쌓아 표현
    [+] List In Python





1. JSON 데이터

아래와 같은 꼴로 이루어진 것을 JSON 데이터라고 한다.
[+] JSON object안의 JSON 데이터를 Property(=속성)이라고 한다.

"데이터이름" :



2. JSON 객체

JSON 객체, 즉 Object는 아래와 같이 이루어진다.
[+] 이름(=Key)(=Value)의 한 쌍으로 이루어진 Property(=속성)들의 정렬되지 않은(순서없음) 집합을 JSON 객체라고 한다.

{
	"name" : "식빵",
    "family" : "웰시코기",
    "age" : 1,
    "weight" : 2.14
}




3. JSON 배열

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







03. JSON Schema

JSON 스키마(schema) : JSON 데이터의 형식을 기술한 문서를 JSON 스키마라고 함.

참고 : http://json-schema.org/



1. JSON Schema Validation

  1. 데이터의 타입이 정확한가?
  2. 필수로 받아와야 하는, 또는 있어야하는 데이터가 포함되어 있는가?
  3. 데이터가 원하는 범위 안에 있는가?

JSON Schema에서는 위와 같은 검증 기준을 모두 키워드(Keyword)를 이용하여 직접 명시할 수 있습니다.




2. Validation Keywords

JSON 스키마에서는 검증 기준을 명시하기 위해 여러 키워드를 사용할 수 있습니다.
이러한 키워드를 사용하여 데이터에 여러 가지 조건을 걸어줄 수 있습니다.

  • type : 유효한 데이터의 타입을 명시함
  • properties : 유효한 데이터 이름과 값의 쌍들을 명시함
  • required : [!]명시한 배열 의 모든 요소를 프로퍼티로 가지고 있어야만 유효함
  • minimum : 최솟값 이상의 숫자만 유효함
  • maximum : 최댓값 이하의 숫자만 유효함
  • multipleOf : 명시한 숫자의 배수만 유효함
  • maxLength : 명시한 최대 길이 이하의 문자열만 유효함.
  • minLength : 명시한 최소 길이 이상의 문자열만 유효함.
  • pattern : 명시한 정규 표현식 에 해당하는 문자열만 유효함.


또한, 스키마에 대한 정보를 나타내는 메타데이터 키워드는 다음과 같음.

  1. title
  2. description
  3. default

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"}으로 명시

...




3. Validation


3-1. 문자열 검증

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

\therefore [a-z]+ : 데이터가 1개 이상의 영문 소문자를 가지는 문자열인지 검사




3-2. 객체 검증

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

\rightarrow 해당 데이터가 객체이면서, 프로퍼티로 "name""family"를 가졌냐를 검사하는 JSON Schema




ex4) 프로퍼티의 개수 검증

{
    "type": "object",
    "minProperties": 1,
    "maxProperties": 2
}

\rightarrow 해당 데이터가 객체이면서, 프로퍼티를 1~2개 가졌는지 검사하는 JSON Schema




3-3. 배열 검증

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
}

\rightarrow 해당 데이터가 배열이면서, 가지고 있는 배열 요소가 3~10개인지 검사하는 JSON Schema




ex4) 중복 값(배열 요소) 검증

{
	"type" : "array",
    "uniqueItems" : true
}

\rightarrow 해당 데이터가 배열이면서, 가지고 있는 배열 요소의 값이 중복되지 않는가를 검사하는 JSON Schema




3-3. 기타 검증

ex) 열거형 데이터 검증

{
	"type" : "string",
    "enum" : ["살라", "마네", "조타"]
}

문자열(string)인 "살라", "마네", "조타" 이외의 모든 값은 검증을 통과할 수 없음



4. Schema 결합

  1. "allOf" : and
  2. "anyOf" : or
  3. "oneOf" : [!]
  4. "not" : not


4-1. allOf

귀찮




4-2. anyOf

귀찮




4-3. oneOf

"oneOf" 키워드를 사용하여 명시된 배열에 나열된 모든 JSON 스키마를 한번에 검사할 수 있음

이때 배열에 나열된 JSON 스키마 중 오직 하나의 스키마 검증을 통과해야 함.

{
	"oneOf" : [
    		   {"type": "number", "multipleOf": 3 },
               {"type": "number", "multipleOf": 4 }
              ]
}

해당 데이터가 숫자 타입이면서...
오직 3의 배수이거나
오직 4의 배수여야지 통과함
[!] 그러면 12는 통과 못하겠네?
"allOf" 또는 "anyOf"에서는 12가 통과할듯




4-4. not

"not" 키워드를 사용하여 명시된 JSON 스키마를 만족하지 않는 데이터만을 검사할 수 있습니다. (이거만 아니면 돼~ 느낌)

{
	"not": {
    		"type" : "string"
           }
}

해당 데이터가 문자열아닌! 데이터만이 검증에 통과함 즉, 모든 문자열은 검증 통과 못함

profile
예술과 기술

0개의 댓글