[ETC] JSON

JD_S·2022년 11월 27일
0

etc

목록 보기
3/4

JSON 개요

JSON

JSON은 JavaScript Object Notation의 약자이다. JSON은 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 만들어진 텍스트 기반의 데이터 교환 표준이다.

{
  "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 기초

JSON을 배우기 위한 사전 지식

JSON은 자바스크립트를 기반으로 만들어졌다. 따라서 JSON을 배우기 전에 자바스크립트에 대한 기초 지식이 있어야 한다.

JSON이란?

JSON은 JavaScript Object Notation의 약자이다. JSON은 사람이 읽을 수 있는 텍스트 기반의 데이터 교환 표준이다. 이러한 JSON은 XML의 대안으로서 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 고안되었다. 또한, JSON은 텍스트 기반이므로 어떠한 프로그래밍 언어에서도 JSON데이터를 읽고 사용할 수 있다.

JSON의 특징

JSON은 다음과 같은 특징을 가진다.

  • JSON은 자바스크립트를 확장하여 만들어졌다.
  • JSON은 자바스크립트 객체 표기법을 따른다.
  • JSON은 사람과 기계가 모두 읽기 편하도록 고안되었다.
  • JSON은 프로그래밍 언어와 운영체제에 독립적이다.

JSON 표준

JSON은 2009년에 더글라스 크록포드가 처음으로 규정하였다. 현재 JSON은 RFC 7159와 ECMA-404라는 두 개의 경쟁 표준에 의해 규정되고 있다. ECMA 표준에서는 문법만 정의할 정도로 최소한의 정보만 정의되어 있으며, RFC 표준은 문법 및 보안에 관련된 사항까지 일부 제공하고 있다.

JSON과 XML

XML이란?

XML은 Extensible Markup Language의 약자이다. 이러한 XML은 HTML과 매우 비슷한 문자 기반의 마크업 언어이다. 이 언어는 사람과 기계가 동시에 읽기 편한 구조로 되어 있다. XML은 HTML처럼 데이터를 보여주는 목적이 아닌, 데이터를 저장하고 전달할 목적으로만 만들어졌다. 또한, XML태그는 HTML태그처럼 미리 정의되어 있지 않고, 사용자가 직접 정의할 수 있다.

JSON과 XML의 공통점

JSON과 XML은 다음과 같은 공통점을 가지고 있다.

  • 둘 다 데이터를 저장하고 전달하기 위해 고안되었다.
  • 둘 다 기계뿐만 아니라 사람도 쉽게 읽을 수 있다.
  • 둘 다 계층적인 데이터 구조를 가진다.
  • 둘 다 다양한 프로그래밍 언어에 의해 파싱될 수 있다.
  • 둘 다 XMLHttpRequest객체를 이용하여 서버로부터 데이터를 전송받을 수 있다.

XMLHttpRequest객체 : 서버로부터 XML데이터를 전송받아 처리하는데 사용된다. 이 객체를 사용하면 웹 페이지가 전부 로딩된 후에도 서버에 데이터를 요청하거나 서버로부터 데이터를 전송받을 수 있다. 즉, 웹 페이지 전체를 다시 로딩하지 않고 일부분만을 갱신할 수 있게 된다.

JSON과 XML의 차이점

하지만 JSON과 XML은 다음과 같은 차이점도 가지고 있다.

  • JSON은 종료 태그를 사용하지 않는다.
  • JSON의 구문이 XML의 구문보다 더 짧다.
  • JSON데이터가 XML데이터보다 더 빨리 읽고 쓸 수 있다.
  • XML은 배열을 사용할 수 없지만, JSON은 배열을 사용할 수 있다.
  • XML은 XML파서로 파싱되며, JSON은 자바스크립트 표준 함수인 eval()함수로 파싱된다.
XML 예제
<dog>
  <name>식빵</name>
  <family>웰시코기</family>
  <age>1</age>
  <weight>2.14</weight>
</dog>

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

JSON의 사용 범위

XML문서는 XML DOM(Document Object Model)을 이용하여 해당 문서에 접근한다. 하지만 JSON은 문자열을 전송받은 후에 해당 문자열을 바로 파싱하므로, XML보다 더욱 빠른 처리 속도를 보여준다. 따라서 HTML과 자바스크립트가 연동되어 빠른 응답이 필요한 웹 환경에서 많이 사용되고 있다.

하지만 JSON은 전송받은 데이터의 무결성을 사용자가 직접 검증해야 한다. 따라서 데이터의 검증이 필요한 곳에서는 스키마를 사용하여 데이터의 무결성을 검증할 수 있는 XML이 아직도 많이 사용되고 있다.

JSON 문법

JSON 문법

JSON은 자바스크립트의 객체 표기법에서 리터럴과 프로퍼티를 표현하는 방법만 가져와서 사용한다. 따라서 JSON데이터는 모양과 규칙이 매우 단순하다. 그로 인해 브라우저 영역에서도 쉽고 빠르게 그 의미를 해석할 수 있으며, 다른 프로그래밍 언어에서도 구현하기 쉽다.

리터럴(literal)

리터럴은 변수와 다르게 해석되는 값 그 자체를 의미한다.

아래 코드에 등장하는 값은 모두 리터럴이다.

12 //숫자 리터럴
"JSON" //문자열 리터럴
true //불리언 리터럴

변수는 데이터를 저장할 수 있는 메모리 공간을 의미하며, 그 값이 변경될 수 있다.

객체(Object)

객체란 실생활에서 우리가 인식할 수 있는 사물로 이해할 수 있다. JSON에서 객체란 이름과 값으로 구성된 프로퍼티의 정렬되지 않은 집합이다.

아래 코드는 이름과 값으로 이루어진 네 쌍의 프로퍼티를 가지는 "강아지" 객체를 나타내는 코드이다.

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

JSON 주석

JSON 표준의 창시자인 더글라스 크록포드는 JSON에는 주석이 들어가지 않는 것이 바르다고 규정하고 있다. 그것은 서로 다른 시스템 간의 연동과 호환성을 위한 조치였다. 반드시 주석을 사용해야 한다면, 주석이 포함된 JSON데이터를 파싱하기 전에 주석만을 먼저 제거해야 한다. 하지만 되도록 JSON에는 주석을 사용하지 않는 것이 좋다.

JSON 구조

JSON 구조

JSON은 자바스크립트의 객체 표기법으로부터 파생된 부분 집합이다. 따라서 JSON데이터는 다음과 같은 자바스크립트 객체 표기법에 따른 구조로 구성된다.

  • JSON데이터는 이름과 값의 쌍으로 이루어진다.
  • JSON데이터는 쉼표로 나열된다.
  • 객체는 중괄호({})로 둘러쌓아 표현한다.
  • 배열은 대괄호([])로 둘러쌓아 표현한다.

JSON 데이터

JSON데이터는 이름과 값의 쌍으로 구성된다. 이러한 JSON데이터는 데이터 이름, 콜론(:), 값의 순서로 구성된다.

"name": "식빵"

데이터의 이름도 문자열이므로, 항상 큰따옴표와 함께 입력해야 한다.
데이터의 값으로는 다음과 같은 타입이 올 수 있다.

  • 숫자
  • 문자열
  • 불리언
  • 객체
  • 배열
  • NULL

JSON 객체

JSON객체는 중괄호({})로 둘러쌓아 표현한다. 또한, JSON객체는 쉼표를 사용하여 여러 프로퍼티를 포함할 수 있다.

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

JSON객체를 그림으로 나타내면 다음과 같다.

JSON 배열

JSON배열은 대괄호([])로 둘러쌓아 표현한다. 또한, JSON배열은 쉼표를 사용하여 여러 JSON데이터를 포함할 수 있다.

아래 코드는 배열의 이름이 "dog"이고, 3개의 JSON객체를 요소로 가지는 JSON배열의 코드이다.

"dog": [
    {"name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14},
    {"name": "콩콩", "family": "포메라니안", "age": 3, "weight": 2.5},
    {"name": "젤리", "family": "푸들", "age": 7, "weight": 3.1}
]

JSON배열을 그림으로 나타내면 다음과 같다.

타입

JSON에서는 데이터의 값으로 사용할 수 있는 다양한 타입을 제공한다. JSON에서 제공하는 기본 타입은 다음과 같다.

  • 숫자
  • 문자열
  • 불리언
  • 객체
  • 배열
  • NULL

숫자

JSON에서 나타낼 수 있는 숫자의 종류는 다음과 같다.

  • 정수(integer)
  • 실수(fraction)
  • 지수(exponent)

JSON에서는 8진수나 16진수 등을 표현하는 방법은 제공하지 않는다.

정수

JSON에서 정수는 부호를 가지는 소수 부분이 없는 수를 의미한다.

{
    "age": 1
}

실수

JSON에서 실수는 소수 부분을 가지는 수를 의미한다.

{
    "weight": 2.14
}

지수

JSON에서는 매우 큰 수나 매우 작은 수를 표현할 때 e 표기법을 사용하여 지수로 표현할 수 있다.

{
    "size": 5.8426e+2
}

문자열

문자열

JSON에서 문자열이란 일련의 연속된 문자의 집합을 의미한다. 이러한 문자열은 큰따옴표안에 유니코드 문자들의 나열로 구성된다. JSON에서 역슬래시()문자는 특정 문자와 함께 사용되어 이스케이프 시퀀스로 사용된다. 따라서 JSON문자열에는 역슬래시와 큰따옴표를 바로 사용할 수 없으며, 이스케이프 시퀀스로 표현해야 한다.

{
    "name": "식빵"
}

자바스크립트에서는 문자열을 표현할 때 큰따옴표와 작은따옴표를 모두 사용할 수 있지만, JSON에서는 오직 큰따옴표만을 사용할 수 있다.

이스케이프 시퀀스

이스케이프 시퀀스는 문자열이 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어졌다. 이러한 이스케이프 시퀀스는 역슬래시와 특정 문자와의 조합으로 사용할 수 있다.

JSON에서 사용할 수 있는 이스케이프 시퀀스는 다음과 같다.

아래 코드는 JSON문자열에서 큰따옴표를 표현하기 위해 이스케이프 시퀀스를 사용하는 코드이다.

{
    "comment": "안녕하세요. \"식빵\" 입니다."
}

JSON파서는 우선 JSON데이터를 모두 읽어 들인다. 위 코드처럼 큰따옴표를 이스케이프 시퀀스(\")로 표현하지 않았다면, 식빵이라는 문자열 앞에 있는 큰따옴표에서 문자열이 모두 끝났다고 인식할 것이다. 따라서 JSON파서는 오류를 발생시킬 것이다.

이처럼 문자열 내에서 큰따옴표나 역슬래시를 표현하기 위해서는 반드시 이스케이프 시퀀스를 사용하여 JSON파서에 해당 따옴표는 문자열을 끝내는 따옴표가 아니라는 사실을 알려주어야만 한다.

불리언

JSON에서 불리언 값은 참과 거짓을 표현한다. 일부 다른 프로그래밍 언어에서는 true 값으로 1을, false 값으로 0을 대신 사용할 수 있다. 또한, 대소문자의 구분 없이 True, TRUE, False, FALSE 등을 모두 사용할 수 있는 언어도 존재한다. 하지만 JSON에서 불리언 값은 항상 true와 false를 소문자로 표기해서 사용해야 한다.

{
    "name": "식빵",
    "lunch": true
}

객체

객체(Object)

JSON에서 객체란 데이터 이름과 값의 한 쌍으로 구성된 프로퍼티의 정렬되지 않은 집합을 의미한다. 이러한 JSON객체는 중괄호({})로 둘러싸여 있다. 객체에 저장되는 프로퍼티는 데이터 이름과 값의 한 쌍으로 이루어져 있다. JSON객체는 쉼표를 사용하여 이러한 프로퍼티를 여러 개 가질 수 있다. 이때 프로퍼티의 순서는 중요하지 않으며, 데이터의 이름은 문자열로 반드시 큰따옴표를 사용해야 한다.

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

객체 안의 객체

JSON에서 데이터 이름과 대응되는 값으로 숫자, 문자열, 불리언뿐만 아니라 또 다른 객체가 올 수도 있다. 만약 데이터의 값이 객체라면 객체 안에 객체가 포함되는 계층 구조가 형성된다.

{
    "dog": {
        "name": "식빵",
        "family": "웰시코기",
        "age": 1,
        "weight": 2.14,
        "owner": {
            "ownerName": "홍길동",
            "phone": "01012345678"
        }
    }
}

위 코드처럼 가장 상위 계층의 데이터 이름은 "dog"이며, 데이터값으로 다섯 개의 또 다른 데이터를 가지고 있다. 그중에서 다섯 번째 데이터인 "owner"객체는 "ownerName"과 "phone"이라는 또 다른 데이터를 가지고 있다.

배열

배열

JSON에서 배열이란 여러 개의 데이터가 순서를 가지고 나열된 집합을 의미한다. 이러한 JSON배열은 대괄호([])로 둘러싸여 있다. JSON배열은 쉼표를 사용하여 여러 개의 데이터를 나열할 수 있다. 이 방식은 객체에서 프로퍼티를 나열하는 것과 비슷하지만, 배열은 데이터의 값만을 나열한다는 차이가 있다. JSON배열은 JSON에서 제공하는 기본 타입을 모두 저장할 수 있다.

아래 코드는 세 개의 문자열 요소를 가지는 "dog"라는 이름의 JSON배열 코드이다.

{
    "dog": [
        "웰시코기",
        "포메라니안",
        "푸들"
    ]
}

JSON에서 배열의 인덱스는 언제나 0부터 시작한다. 따라서 위의 코드에서 "웰시코기"는 0, "포메라니안"은 1, "푸들"은 2의 인덱스를 가지게 된다.

배열과 객체의 차이점

JSON에서 배열과 객체는 여러 데이터를 묶어놓은 집합이라는 점에서 서로 비슷한 타입이다. 하지만 객체는 프로퍼티의 집합이며, 배열은 데이터값의 집합이라는 차이가 있다.

{
    "dog": [
        "웰시코기",
        "포메라니안",
        "푸들",
        {
            "ownerName": "홍길동",
            "phone": "01012345678"
        }
    ]
}

위 코드에서 "dog"라는 이름의 JSON배열은 문자열뿐만 아니라 객체도 요소로 가지고 있다. 대부분의 프로그래밍 언어에서 배열은 여러 타입의 데이터를 동시에 가질 수 없다. 하지만 자바스크립트 기반의 JSON배열은 여러 타입의 배열 요소를 가질 수 있다.

null

null

JSON에서 null이란 아무런 값도 가지고 있지 않은 빈 값을 의미한다. JSON에서 이러한 null값은 항상 null을 소문자로 표기해서 사용해야 한다.

{
    "id": 1,
    "name": null
}

undefined와 null

null은 자바스크립트의 undefined타입과 혼동하기 쉽다. 더군다나 JSON에서는 undefined타입을 제공하지 않으므로, 더욱 유의해야 한다. 자바스크립트에서 '값'자체가 없다는 의미의 undefined값은 초기화되지 않은 변수나 존재하지 않는 값에 접근할 때 반환한다. 하지만 JSON에서 null이란 '값'을 가지고 있지 않다는 의미를 가지는 하나의 데이터값이라고 할 수 있다.

JSON 스키마

JSON 스키마(schema)

JSON은 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 만들어진 데이터 교환 표준이다. 이때 JSON 데이터를 전송받는 측에서는 전송받은 데이터가 적법한 형식의 데이터인지를 확인할 방법이 필요하다. 따라서 적법한 JSON데이터의 형식을 기술한 문서를 JSON스키마라고 한다.

JSON 스키마 검증(validation)

JSON스키마는 다음과 같은 세 가지 검증 과정을 거친다.

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

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

검증 키워드

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

JSON스키마에서 사용할 수 있는 대표적인 검증 키워드는 다음과 같다.

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

  • title
  • description
  • default

아래 코드는 검증 키워드와 메타 데이터 키워드를 이용한 JSON스키마 코드이다.

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

type키워드를 사용하면 유효한 타입을 명시하면, 해당 데이터가 유효한지를 검사할 수 있다. 이때 사용할 수 있는 타입에는 JSON의 기본 타입을 모두 사용할 수 있다.

properties키워드를 사용하면, 해당 객체가 가지는 프로퍼티가 유효한지를 검사할 수 있다.

숫자 검증

정수 검증

type키워드의 값을 integer로 명시하면, 해당 데이터가 정수인지를 검사해 준다.

{
    "type": "integer"
}

위 코드에서 0, -10, 4 등의 정수는 검증을 통과할 것이다. 하지만 2.156과 같은 실수나 "123"과 같은 문자열 등은 검증을 통과하지 못한다.

숫자 검증

type키워드의 값을 number로 명시하면, 해당 데이터가 숫자인지를 검사해 준다. 이때 정수뿐만 아니라 소수부를 가지는 실수까지도 모두 검증을 통과한다.

{
    "type": "number"
}

위 코드에서 0, 10, 3.14, -4.56 등의 모든 정수와 실수는 검증을 통과한다. 하지만 "123"과 같은 문자열이나 true와 같은 불리언 등은 검증을 통과하지 못한다.

배수 검증

multipleOf키워드를 사용하여 해당 숫자가 명시된 숫자의 배수인지를 검사할 수 있다.

아래 코드는 해당 데이터가 숫자이면서, 3의 배수인지를 검사하는 코드이다.

{
    "type": "number",
    "multipleOf": 3
}

위의 예제에서 0, 3, 6, 9 등의 3의 배수인 숫자는 검증을 통과한다. 하지만 10, 20과 같이 3의 배수가 아닌 숫자나 "123"과 같은 문자열 등은 검증을 통과하지 못한다.

범위 검증

다음과 같은 키워드를 사용하면 해당 숫자의 유효한 범위를 명시할 수 있다.

  • minimum
  • maximum
  • exclusiveMinimum
  • exclusiveMaximum

minimummaximum키워드를 사용하면 해당 숫자가 가질 수 있는 최솟값과 최댓값을 명시할 수 있다. exclusiveMinimumexclusiveMaximum키워드는 불리언 값을 명시할 수 있다. 만약 exclusiveMinimum값이 true이면, 해당 숫자가 가질 수 있는 최솟값으로 minimum키워드로 명시된 값을 포함하지 않고 검사한다.

하지만, exclusiveMinimum값이 false이면, 최솟값으로 minimum키워드로 명시된 값까지 포함해서 검사한다. exclusiveMaximum키워드도 해당 숫자가 가질 수 있는 최댓값에 대해 exclusiveMinimum과 같은 방식으로 동작한다. exclusiveMinimumexclusiveMaximum키워드는 값을 따로 명시하지 않으면, 기본값으로 false를 저장한다.

아래 코드는 해당 데이터가 1보다 크거나 같고(n>=1) 10보다는 작은(n<10) 정수 또는 실수인지를 검사하는 코드이다.

{
    "type": "number",
    "minimum": 1,
    "maximum": 10,
    "exclusiveMaximum": true
}

문자열 검증

문자열 검증

type키워드의 값을 string으로 명시하면, 해당 JSON데이터가 유니코드 문자열인지를 검사해 준다.

{
    "type": "string"
}

위 코드에서 "제이슨", "JSON", "123"등의 문자열은 검증을 통과한다. 하지만 1, 3.14와 같은 숫자나 true와 같은 불리언 등은 검증을 통과하지 못한다.

문자열 길이 검증

minLengthmaxLength키워드를 사용하여 해당 문자열의 길이가 유효한지를 검사할 수 있다. 이때 minLengthmaxLength키워드의 값은 0을 포함한 양수만을 사용할 수 있다.

아래 코드는 해당 문자열의 길이가 1보다 크고 4보다 작은지를 검사하는 코드이다.

{
    "type": "string",
    "minLength": 1,
    "maxLength": 4
}

정규 표현식 검증

pattern키워드를 사용하여 해당 문자열이 명시된 정규 표현식과 일치하는지를 검사할 수 있다. 정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다. 이러한 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용될 수 있다.

JSON에서는 자바스크립트에서 사용할 수 있는 정규 표현식 문법을 모두 사용할 수 있다. JSON 정규 표현식에서 주로 사용되는 패턴 문자는 다음과 같다.

아래 코드는 정규 표현식을 이용하여 해당 데이터가 1개 이상의 영문 소문자를 가지는 문자열인지를 검사한다.

{
    "type": "string",
    "pattern": "[a-z]+"
}

객체 검증

객체 검증

type키워드의 값을 object로 명시하면, 해당 데이터가 객체인지를 검사해 준다.

{
    "type": "object"
}

위 코드에서 데이터 이름과 값의 쌍인 프로퍼티를 갖는 객체는 검증을 통과할 것이다. 하지만 "123"과 같은 문자열이나 배열 등은 검증을 통과하지 못한다.

프로퍼티 검증

객체의 프로퍼티는 데이터 이름과 값의 쌍으로 구성된다. properties키워드를 사용하여 해당 객체가 가지는 프로퍼티가 유효한지를 검사할 수 있다.

{
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "family": {"type": "string"},
        "age": {"type": "integer"},
        "weight": {"type": "number"}
    }
}

아래 코드의 JSON객체는 위 코드와 같은 검증을 통과할 것이다.

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

하지만 아래 코드의 JSON객체는 ageweight프로퍼티가 값으로 문자열을 가지므로, 검증을 통과하지 못한다.

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

필수 프로퍼티 검증

required키워드를 사용하여 해당 객체가 반드시 가지고 있어야 하는 필수 프로퍼티를 명시할 수 있다. 만약 필수 프로퍼티가 하나 이상이라면, 배열을 이용하여 각 필수 프로퍼티의 이름을 나열하면 된다.

아래 코드는 해당 데이터가 객체이면서, 프로퍼티로 namefamily를 가졌는지 검사하는 코드이다.

{
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "family": {"type": "string"},
        "age": {"type": "integer"},
        "weight": {"type": "number"}
    },
    "required": ["name", "family"]
}

프로퍼티의 개수 검증

minPropertiesmaxProperties키워드를 사용하여 해당 객체가 가질 수 있는 프로퍼티 개수의 최솟값과 최댓값을 명시할 수 있다.

아래 코드는 해당 데이터가 객체이면서, 프로퍼티를 1개나 2개만 가졌는지를 검사하는 코드이다.

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

배열 검증

배열 검증

type키워드의 값을 array로 명시하면, 해당 데이터가 배열인지를 검사해 준다.

{
    "type": "array"
}

위 코드에서 여러 개의 데이터가 순서를 가지고 대괄호로 둘러싸인 배열은 검증을 통과할 것이다. 하지만 1, 3.14와 같은 숫자나 객체 등은 검증을 통과하지 못한다.

배열 요소 검증

items키워드를 사용하여 해당 배열에 저장된 배열 요소에 대한 검증을 수행할 수 있다. itmes키워드와 함께 명시된 JSON스키마로 각 배열 요소의 검증을 수행한다.

아래 코드는 해당 데이터가 배열이면서, 각 배열 요소가 모두 정수인지를 검사하는 코드이다.

{
    "type": "array",
    "items": {
        "type": "integer"
    }
}

위 코드에서 배열 요소가 모두 정수인 배열이나 배열 요소가 하나도 없는 빈 배열은 검증을 통과할 것이다. 하지만 배열 요소로 정수 외의 데이터를 가지는 배열은 검증을 통과하지 못한다. 배열의 각 요소를 서로 다른 JSON스키마로 검사하고 싶다면, items키워드와 함께 배열로 스키마를 명시하면 된다. 이 배열은 각 배열 요소를 검사할 JSON스키마가 저장되어 있다.

아래 코드는 해당 데이터가 배열이면서, 각 배열 요소를 서로 다른 JSON스키마로 검사하는 코드이다.

{
    "type": "array",
    "items": [
        {
            "type": "string",
            "maxLength": 5
        },
        {
            "type": "string"
        },
        {
            "type": "string"
        }
    ]
}

위 코드에서 첫 번째 배열 요소가 5개의 문자를 넘지 않는 문자열이며, 두 번째와 세 번째 배열 요소가 문자열인 배열은 검증을 통과할 것이다. 또한, 세 개의 유효한 배열 요소 외에 추가로 다른 배열 요소를 가지고 있는 배열도 검증을 통과할 것이다.

하지만 additionalItems키워드의 값을 false로 명시하면, 추가로 다른 배열 요소를 가지는 배열은 검증을 통과하지 못하게 된다.

{
    "type": "array",
    "items": [
        {
            "type": "string",
            "maxLength": 5
        },
        {
            "type": "string"
        },
        {
            "type": "string"
        }
    ],
    "additionalItems": false
}

배열 길이 검증

minItemsmaxItems키워드를 사용하여 해당 배열이 가질 수 있는 길이와 최솟값과 최댓값을 명시할 수 있다.

아래 코드는 해당 데이터가 배열이면서, 가지고 있는 배열 요소가 3개부터 10개까지인가를 검사하는 코드이다.

{
    "type": "array",
    "minItems": 3,
    "maxItems": 10
}

중복 값 검증

uniqueItems키워드를 사용하여 해당 배열에 저장된 배열 요소에 대한 중복 값 허용 여부를 명시할 수 있다. uniqueItems값이 true이면, 배열 요소의 값에 중복 값을 허용하지 않을 수 있다.

아래 코드는 해당 데이터가 배열이면서, 가지고 있는 배열 요소의 값이 중복되지 않는가를 검사하는 코드이다.

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

기타 검증

불리언 검증

type키워드의 값을 boolean으로 명시하면, 해당 데이터가 불리언인지를 검사해 준다. 이때는 데이터의 값이 truefalse인 경우에만 검증을 통과할 수 있다.

{
    "type": "boolean"
}

JSON은 불리언 truefalse대신에 숫자 1과 0을 대신 사용할 수 없으므로, 위 코드에서 숫자 1과 0은 통과할 수 없다.

null 검증

type키워드의 값을 null로 명시하면, 해당 데이터가 null인지를 검사해 준다.

{
    "type": "null"
}

위 코드에서 null이외의 모든 값은 검증을 통과하지 못한다.

열거형 데이터 검증

enum키워드를 사용하여 해당 데이터가 명시된 배열에 속한 값인지를 검사할 수 있다. 유효한 enum값들은 배열을 사용하여 명시하며, 중복 값을 가질 수는 없다.

{
    "type": "string",
    "enum": ["웰시코기", "포메라니안", "푸들"]
}

위 코드에서 문자열인 "웰시코기", "포메라니안", "푸들" 이외의 모든 값은 검증을 통과할 수 없다.

스키마 결합

스키마 결합

JSON스키마에서는 다음 키워드를 사용하여 여러 JSON스키마를 결합할 수 있다.

  • allOf
  • anyOf
  • oneOf

allOf

allOf키워드를 사용하여 명시된 배열에 나열된 모든 JSON스키마를 한 번에 검사할 수 있다. 이때 배열에 나열된 스키마에 대한 검증을 모두 통과해야 한다.

아래 코드는 해당 문자열 데이터의 길이가 3이상이고 5이하인지를 검사하는 코드이다.

{
    "allOf": [
        {"minLength": 3},
        {"maxLength": 5}
    ]
}

위 코드에서 해당 문자열 데이터의 길이가 최소 3이상인지를 검사하는 스키마와 해당 문자열 데이터의 길이가 최대 5이하인지를 검사하는 스키마가 있다. 이때 allOf키워드를 사용하여 두 스키마를 결합하므로, 두 스키마의 검증을 모두 통과하는 데이터만이 검증을 통과할 것이다. 따라서 "abc", "1234"와 같이 문자열의 길이가 3이상이고 5이하인 문자열만이 검증을 통과하게 된다.

anyOf

anyOf키워드를 사용하여 명시된 배열에 나열된 모든 JSON스키마를 한 번에 검사할 수 있다. 이때 배열에 나열된 하나 이상의 스키마에 대한 검증을 통과해야 한다.

아래 코드는 해당 데이터가 문자열이나 숫자인지를 검사하는 코드이다.

{
    "anyOf": [
        {"type": "string"},
        {"type": "number"}
    ]
}

위 코드에서는 해당 데이터가 문자열인지를 검사하는 스키마와 숫자인지를 검사하는 스키마가 결합하여 있다. 여기에 anyOf키워드를 사용했으므로, 두 스키마 중 어느 하나의 검증을 통과하는 데이터만이 검증을 통과할 것이다. 따라서 문자열과 숫자만이 검증을 통과한다.

oneOf

oneOf키워드를 사용하여 명시된 배열에 나열된 모든 JSON스키마를 한 번에 검사할 수 있다. 이때 배열에 나열된 오직 하나의 스키마에 대한 검증만을 통과해야 한다.

아래 코드는 해당 데이터가 숫자이면서 3의 배수이거나, 아니면 숫자이면서 4의 배수인지를 검사하는 코드이다.

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

위 코드에서는 해당 데이터가 숫자이면서 3의 배수인지를 검사하는 스키마와 숫자이면서 4의 배수인지를 검사하는 스키마가 결합하여 있다. 여기에 oneOf키워드를 사용했으므로, 두 스키마 중 오직 하나의 검증만을 통과하는 데이터만이 검증을 통과할 것이다. 따라서 3, 6, 9와 같은 3의 배수와 4, 8, 16과 같은 4의 배수는 검증을 통과한다. 하지만 12, 24, 36과 같은 3과 4의 공배수는 검증을 통과할 수 없다.

not

not키워드를 사용하여 명시된 JSON스키마를 만족하지 않는 데이터만을 검사할 수 있다.

아래 코드는 해당 데이터가 문자가 아닌지를 검사하는 코드이다.

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

위 코드에서 해당 데이터가 문자열이 아닌 데이터만이 검증을 통과한다. 즉, 모든 문자열은 검증을 통과하지 못한다.

JSON 사용

자바스크립트와 JSON

자바스크립트와 JSON

JSON은 자바스크립트의 객체 표기법을 제한하여 만든 텍스트 기반의 데이터 교환 표준이다. 따라서 JSON데이터는 자바스크립트가 자주 사용되는 웹 환경에서 사용하는 것이 유리하다. 자바스크립트에서 JSON데이터를 분석하고 사용하는 것은 매우 간단하다. 자바스크립트는 JSON데이터를 처리하기 위한 다음과 같은 메서드를 제공하고 있다.

  • JSON.stringify()
  • JSON.parse()
  • toJSON()

JSON.stringify() 메서드

JSON.stringify()메서드는 인수로 전달받은 자바스크립트 객체를 문자열로 변환하여 반환한다.

JSON.stringify(value)

value에는 변환할 자바스크립트 객체를 전달한다. 이 메서드는 UTF-16으로 인코딩된 JSON형식의 문자열을 반환한다.

JSON.stringify()메서드를 지원하는 주요 웹 브라우저의 버전은 다음과 같다.

이미지가 잘못 기재 되어있음

var dog = {name: "식빵", family: "웰시코기", age: 1, weight: 2.14}; // 자바스크립트 객체

var data = JSON.stringify(dog);                    // 자바스크립트 객체를 문자열로 변환함.

document.getElementById("json").innerHTML = data;

JSON.parse() 메서드

JSON.parse()메서드는 JSON.stringify()메서드와는 반대로 인수로 전달받은 문자열을 자바스크립트 객체로 변환하여 반환한다.

JSON.parse(text)

text에는 변환할 문자열을 전달한다. 이때 해당 문자열은 반드시 유효한 JSON형식의 문자열이어야 한다. 만약 JSON형식에 맞지 않는 문자열을 전달하면, 자바스크립트는 오류를 발생시킬 것이다.

JSON.parse()메서드를 지원하는 주요 웹 브라우저의 버전은 다음과 같다.

var data = '{"name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14}'; // JSON 형식의 문자열

var dog = JSON.parse(data);                       // JSON 형식의 문자열을 자바스크립트 객체로 변환함.

document.getElementById("json").innerHTML += dog.name + ", " + dog.family;

JSON.parse()메서드는 오직 JSON형식의 문자열만을 변환할 수 있다.

toJSON() 메서드

자바스크립트의 toJSON()메서드는 자바스크립트의 Date객체의 데이터를 JSON형식의 문자열로 변환하여 반환한다. 따라서 이 메서드는 Date.prototype객체에서만 사용할 수 있다. toJSON()메서드는 접미사Z로 식별되는 UTC 표준 시간대의 날짜를 ISO 8601 형식의 문자열로 반환한다. 따라서 이 문자열은 언제나 24개나 27개의 문자로 이루어지며, 다음과 같은 형식을 따른다.

문법
YYYY-MM-DDTHH:mm:ss.sssZ
또는
±YYYYYY-MM-DDTHH:mm:ss.sssZ

예제
var date = new Date();   // 자바스크립트 Date 객체
var str = date.toJSON(); // Date 객체를 JSON 형식의 문자열로 변환함.

document.getElementById("json").innerHTML = date + "<br>";
document.getElementById("json").innerHTML += str;

Reference

profile
Whatever does not destroy me makes me stronger.

0개의 댓글