[ETC] :: JSON

IT/ETC 2020. 2. 17. 15:47

JSON( JavaScript Object Notation )

Concepts

  • '속성-값' 쌍 또는 '키-값' 쌍으로 이루어진 개방형 표준( Opened Standard )1) 데이터 포맷이다.
    • 이 값 하나 하나를 리터럴(literal), 키-값 쌍을 프로퍼티(property)라 한다.
  • 브라우저/서버 통신을 위해, 넓게는 XML을 대체하는 주요 데이터 포맷으로.
    특히 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다.
  • 자료의 종류에 큰 제한은 없으며 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.
  • 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만,
    실제로는 프로그래밍 언어나 플랫폼에 독립적이다.


개방형 표준( Opened Standard )1)

기술에 대한 표준 문서가 공개되어 있으며 사용이 자유롭다.
상황에 따라 다른 정의가 존재하며, 표준 단체, 국가마다 서로 다른 정의를 가질 수 있다.


사용 목적

  • 주로 서버에서 클라이언트로 데이터를 보낼 때 사용하는데,
    서버측에서는 클라이언트가 사용하는 언어에 관계 없이 일정한 패턴을 지닌 데이터를 생성해 전송하면
    클라이언트는 그 데이터를 해석해 자기만의 방식으로 가공해 사용할 수 있다.
  • 웹 초기 시절부터 사용한 XML과 비교하자면,
    이 XML은 헤더, 태그 등의 요소들로가독성이 떨어지며, 비교적 용량을 많이 잡아먹는다는 단점이 있다.
    이에 대응해 XML보다 훨씬 간결하고, 가벼운 용량의 양식으로 JSON이 각광을 받고 있다.



Advantage

  • 텍스트로 이루어져 있어 사람이 읽고 쓰기 쉽다.
  • XML에 비해 구문이 더 짧고 배열을 사용할 수 있다.
  • 프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.



Data type

  • 수(Number) : 정수, 실수, 지수 ( 8진수나 16진수 등의 표현법은 제공하지 않음 )
    12
    -3.14
    1.234e+5
    
  • 문자열(String) : 큰따옴표(")로 구분되는 유니코드 문자
    "anbo"
    "한글"
    
  • 참/거짓(Boolean) : 기본적으로 true와 false를 소문자로만 표기한다.
    true
    false
    
  • NULL : 아무런 값도 가지고 있지 않으며, 소문자로 표기해야 한다.
    null
    
  • 객체(Object) : 프로퍼티의 집합으로, 중괄호{}로 나타낸다.
    이름은 항상 문자열이며, 값은 JSON 데이터 타입이다.
    객체 안에 객체가 포함되는 계층 구조도 가능하며, 모든 값들은 쉼표(,)로 구분한다.
    { string:value [, string:value] [, string:value] ... }
    
    {
        "월": "January",
        "제목": "Survey",
        "참여여부": false
    }
    
  • 배열(Array) : 여러 개의 데이터가 순서를 가지고 나열된 집합이며 대괄호[]로 나타낸다.
    배열의 각 요소는 JSON의 데이터 타입이다.
    객체와 달리 배열은 데이터의 값만을 나열하며, 쉼표(,)로 구분한다.
    배열의 인덱스는 언제나 0부터 시작하며, 여러 타입의 배열 요소를 가질 수 있다.
    [ value [, value] [, value] ... ]
    
    {
        "kpop":[
            "METEOR",
            "아무노래",
            {
                "age": "25",
                "year": "2020",
                "etc": null
            }
        ]
    }
    

Example

Ubuntu 에서 JavaScript로 진행한 간단한 테스트 예제

  • 한 사람에 관한 정보를 갖는 JSON 객체
    • test.js
      console.log( "START" );
      
      var anbo = { "이름": "안보현",
                   "나이": 29,
                   "특기": [
                       "독서",
                       "피아노"
                   ],
                   "가족관계": {
                       "#": 3, 
                       "아버지": "0",
                       "어머니": "1",
                       "형": "2"
                   },
                   "회사": "선재소프트"
                 }
      
      console.log( anbo );
      console.log( "FINISH" );
      
    • terminal
      [anbo@h JavaScript]$ node test.js
      START
      { '이름': '안보현',
        '나이': 29,
        '특기': [ '독서', '피아노' ],
        '가족관계': { '#': 3, '아버지': '0', '어머니': '1', '형': '2' },
        '회사': '선재소프트' }
      FINISH
      



Validation

  • JSON 스키마는 다음과 같은 세 가지 검증(validation) 과정을 거친다.
    1. 데이터 타입이 정확한가
    2. 필수로 받아야 하는 데이터가 포함되어 있는가
    3. 데이터가 유효한 범위 내에 있는가
  • 이러한 검증 기준을 모두 키워드(keyword)를 이용해 직접 명시할 수 있다.
  • 검증 키워드
    • 데이터에 대한 정보를 나타내는 검증 키워드
      • type : 데이터의 타입
      • properties : 데이터 이름-값 쌍
      • required : 배열의 모든 요소를 프로퍼티로 가지고 있는지
      • minimum : 최솟값 이상의 숫자만
      • maximum : 최댓값 이하의 숫자만
      • multipleOf : 명시한 숫자의 배수만
      • maxLength : 명시한 최대길이 이하의 문자열만
      • minLength : 명시한 최소길이 이상의 문자열만
      • pattern : 명시한 정규 표현식
    • 스키마에 대한 정보를 나타내는 메타 데이터 키워드
      • title : 제목
      • description : 설명
      • default : 기본값
    • 예시
      {
          "title": "선재소프트 스키마",
          "description": "이 스키마는 선재소프트에 대한 데이터를 검증하기 위해 작성된 스키마이다.",
          "type": "object",
          "properties": {
                  "name": {"type": "string"},
                  "age": {"type": "integer"}
                  "team": {
                      "teamName": {"type": "string"},
                      "job": {"type": "string"}
                  }
          }
      }
      
  • 문자열 검증의 경우, pattern 키워드를 사용해 정규 표현식 검증을 할 수 있다.
    1개 이상의 영어 소문자인지 검증하는 예제
    
    {
        "type": "string",
        "pattern": "[a-z]+"
    }



스키마 결합

  • JSON 스키마에서 다음과 같은 키워드를 사용해 여러 스키마들을 결합할 수 있다.
    • allOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 검증을 모두 통과해야한다.
        해당 문자열의 데이터 길이가 3 이상 5 이하를 검사하는 예제
        
        {
            "allOf": [
                {"minLength": 3},
                {"maxLength": 5}
            ]
        }
        
    • anyOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 하나 이상의 검증을 통과해야 한다.
        해당 데이터가 문자열 혹은 숫자인지 검사하는 예제
        
        {
            "anyOf": [
                {"type": "string"},
                {"type": "number"}
            ]
        }
        
    • oneOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 오직 하나의 검증을 통과해야 한다.
        해당 데이터가 숫자이면서 3의 배수이거나, 숫자이면서 4의 배수인지 검사하는 예제
        
        {
            "oneOf": [
                { "type": "number", "multipleOf": 3 },
                { "type": "number", "multipleOf": 4 }
            ]
        }
        
    • not
      • 명시된 스키마를 만족하지 않는 데이터만을 검사한다.
        해당 데이터가 문자가 아닌지 검사하는 예제
        
        {
            "not": {
                "type": "string"
            }
        }
        



Examples

  • Basic
    {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city":           { "type": "string" },
        "state":          { "type": "string" }
      },
      "required": ["street_address", "city", "state"]
    }
    
  • Product 스키마
    { 
      "name":"Product", 
      "properties": 
      { 
        "id": 
        { 
          "type":"number", 
          "description":"Product identifier", 
          "required":true 
        }, 
        "name": 
        { 
          "description":"Name of the product", 
          "type":"string", 
          "required":true 
        }, 
        "price": 
        { 
          "type":"number", 
          "minimum":0, 
          "required":true 
        }, 
        "tags": 
        { 
          "type":"array", 
          "items": 
          { 
            "type":"string" 
          } 
        } 
      } 
    }
    
  • allOf
    스키마 
    {
      "definitions": {
        "address": {
          "type": "object",
          "properties": {
            "street_address": { "type": "string" },
            "city":           { "type": "string" },
            "state":          { "type": "string" }
          },
          "required": ["street_address", "city", "state"]
        }
      },
    
      "allOf": [
        { "properties": {
            "type": { "enum": [ "residential", "business" ] }
          }
        }
      ]
    }
    
  • Data의 추가 및 삭제( Ubuntu 에서 JavaScript로 진행 )
    • test.js
      var movie = {
          "title": "Avengers - End game",
          "actor": [
              "Robert Downey Jr.",
              "Chris Evans",
              "Scarlett Johansson"],        
          "director": "Russo brother"
      }
      
      console.log( "###############################" );
      console.log( "START" );
      console.log( "###############################" );
      console.log( " " );
      
      console.log( "< object movie >" );
      console.log( movie );
      
      console.log( " " );
      console.log( "###############################" );
      console.log( "AVENGERS's 4th series!" );
      console.log( "###############################" );
      console.log( " " );
      console.log( "TITLE : " + movie.title );
      console.log( "ACTOR : " + movie.actor[0] );
      console.log( "        " + movie.actor[1] );
      console.log( "        " + movie.actor[2] );
      
      movie.actor[3] = "Jeremy Renner";
      
      console.log( "        " + movie.actor[3] );
      console.log( "DIRECTOR : " + movie.director );
      
      movie.year = 2019;
      
      console.log( "YEAR : " + movie.year );
      console.log( " " );
      console.log( "###############################" );
      console.log( " " );
      
      console.log( "< object movie >" );
      console.log( movie );
      
      console.log( " " );
      console.log( "###############################" );
      console.log( "FINISH" );
      console.log( "###############################" );
      
    • terminal
      [anbo@h JavaScript]$ node test.js
      ###############################
      START
      ###############################
      
      < object movie >
      { title: 'Avengers - End game',
        actor: [ 'Robert Downey Jr.', 'Chris Evans', 'Scarlett Johansson' ],
        director: 'Russo brother' }
      
      ###############################
      AVENGERS's 4th series!
      ###############################
      
      TITLE : Avengers - End game
      ACTOR : Robert Downey Jr.
              Chris Evans
              Scarlett Johansson
              Jeremy Renner
      DIRECTOR : Russo brother
      YEAR : 2019
      
      ###############################
      
      < object movie >
      { title: 'Avengers - End game',
        actor:
         [ 'Robert Downey Jr.',
           'Chris Evans',
           'Scarlett Johansson',
           'Jeremy Renner' ],
        director: 'Russo brother',
        year: 2019 }
      
      ###############################
      FINISH
      ###############################
      




'IT > ETC' 카테고리의 다른 글

[ETC] :: Spring Cloud 마이크로서비스 애플리케이션  (0) 2023.06.22
블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,