JSON이란 무엇이며 어떻게 사용합니까?

게시 됨: 2022-08-14
컴퓨터 모니터에 오버레이된 "JSON" 텍스트 이미지
마리아 보노나/Shutterstock.com

JSON(JavaScript Object Notation)은 구조화된 데이터를 표현하기 위한 표준화된 형식입니다. JSON은 JavaScript 프로그래밍 언어에서 발전했지만 이제는 시스템 간 데이터 교환의 유비쿼터스 방법입니다. 대부분의 최신 API는 JSON 요청을 수락하고 JSON 응답을 발행하므로 형식과 해당 기능에 대한 실무 지식이 있으면 유용합니다.

이 기사에서는 JSON이 무엇인지, 다양한 데이터 유형을 표현하는 방법, 널리 사용되는 프로그래밍 언어에서 JSON을 생성하고 소비하는 방법에 대해 설명합니다. 또한 JSON의 몇 가지 제한 사항과 등장한 대안에 대해서도 다룰 것입니다.

JSON 기초

JSON은 원래 Douglas Crockford가 브라우저와 서버 간의 데이터 통신을 위한 상태 비저장 형식으로 고안했습니다. 2000년대 초반으로 돌아가면 웹사이트는 초기 페이지 로드 후 서버에서 비동기식으로 추가 데이터를 가져오기 시작했습니다. JavaScript에서 파생된 텍스트 기반 형식인 JSON은 이러한 애플리케이션 내에서 데이터를 가져오고 사용하는 것을 더 간단하게 만들었습니다. 사양은 결국 2013년 ECMA-404로 표준화되었습니다.

JSON은 항상 문자열로 전송됩니다. 이러한 문자열은 숫자, 부울, 배열 및 개체를 포함한 다양한 기본 데이터 유형으로 디코딩될 수 있습니다. 이것은 객체 계층 구조와 관계가 전송 중에 보존될 수 있고 프로그래밍 환경에 적합한 방식으로 수신 측에서 재조립될 수 있음을 의미합니다.

기본 JSON 예제

다음은 블로그 게시물의 JSON 표현입니다.

 {
    "아이디": 1001,
    "제목": "JSON이란 무엇입니까?",
    "작가": {
        "아이디": 1,
        "이름": "제임스 워커"
    },
    "태그": ["api", "json", "프로그래밍"],
    "게시된": 거짓,
    "publishedTimestamp": null
}

이 예는 모든 JSON 데이터 유형을 보여줍니다. 또한 API에서 사용하기에 매우 매력적인 특성 중 하나인 JSON 형식 데이터의 간결함을 보여줍니다. 또한 JSON은 XML과 같은 장황한 형식과 달리 있는 그대로 읽기가 비교적 쉽습니다.

JSON 데이터 유형

6가지 유형의 데이터가 JSON으로 기본적으로 표시될 수 있습니다.

  • 문자열 – 문자열은 큰따옴표 사이에 작성됩니다. 문자는 백슬래시를 사용하여 이스케이프될 수 있습니다.
  • 숫자 – 숫자는 따옴표 없이 숫자로 작성됩니다. 부동 소수점을 나타내기 위해 분수 구성요소를 포함할 수 있습니다. 대부분의 JSON 구문 분석 구현은 소수점이 없을 때 정수를 가정합니다.
  • 부울 – 리터럴 값 truefalse 가 지원됩니다.
  • Nullnull 리터럴 값은 비어 있거나 생략된 값을 나타내는 데 사용할 수 있습니다.
  • 배열 – 배열은 대괄호로 표시되는 간단한 목록입니다. 목록의 각 요소는 쉼표로 구분됩니다. 배열은 여러 항목을 포함할 수 있으며 지원되는 모든 데이터 유형을 사용할 수 있습니다.
  • 개체 – 개체는 중괄호로 생성됩니다. 키가 큰따옴표로 묶인 문자열인 키-값 쌍의 모음입니다. 각 키에는 사용 가능한 모든 데이터 유형을 사용할 수 있는 값이 있습니다. 개체를 중첩하여 계단식 계층을 만들 수 있습니다. 각 값 뒤에 쉼표가 있어야 해당 키-값 쌍의 끝을 나타냅니다.

JSON 파서는 이러한 데이터 유형을 해당 언어에 적합한 구조로 자동 변환합니다. 예를 들어 id 를 정수로 수동으로 캐스팅할 필요가 없습니다. 전체 JSON 문자열을 구문 분석하면 값을 원래 데이터 형식으로 다시 매핑하기에 충분합니다.

의미 및 유효성 검사

JSON에는 데이터를 인코딩할 때 준수해야 하는 특정 규칙이 있습니다. 구문을 준수하지 않는 문자열은 소비자가 구문 분석할 수 없습니다.

문자열과 개체 키 주위의 따옴표에 주의하는 것이 특히 중요합니다. 또한 개체 또는 배열의 각 항목 뒤에 쉼표가 사용되었는지 확인해야 합니다. JSON은 마지막 항목 뒤에 오는 쉼표를 허용 하지 않습니다 . 의도치 않게 쉼표를 포함하는 것은 유효성 검사 오류의 일반적인 원인입니다. 대부분의 텍스트 편집기는 구문 문제를 강조 표시하여 실수를 찾는 데 도움이 됩니다.

이러한 일반적인 트립 지점에도 불구하고 JSON은 손으로 작성하기 가장 쉬운 데이터 형식 중 하나입니다. 대부분의 사람들은 일단 익숙해지면 구문을 빠르고 편리하게 찾습니다. 전반적인 JSON은 일치하지 않는 열기 및 닫기 태그, 잘못된 스키마 선언 및 문자 인코딩 문제로 인해 종종 문제가 발생하는 XML보다 오류가 발생하기 쉬운 경향이 있습니다.

JSON 콘텐츠 지정

.json 확장자는 일반적으로 JSON이 파일에 저장될 때 사용됩니다. JSON 콘텐츠는 표준화된 MIME 유형 application/json 을 가지고 있지만, text/json 은 호환성을 위해 때때로 사용됩니다. 요즘에는 AcceptContent-Type HTTP 헤더에 대해 application/json 에 의존해야 합니다.

JSON을 사용하는 대부분의 API는 최상위 객체에 모든 것을 캡슐화합니다.

 {
    "오류": 1000
}

그러나 이것은 필수가 아닙니다. 리터럴 유형은 파일의 최상위 노드로 유효하므로 다음 예제도 모두 유효한 JSON입니다.

 1000 
 진실 
 없는

프로그래밍 언어에서 해당 스칼라로 디코딩합니다.

JSON 작업

대부분의 프로그래밍 언어에는 JSON 지원이 내장되어 있습니다. 다음은 몇 가지 인기 있는 환경에서 JSON 데이터와 상호 작용하는 방법입니다.

자바스크립트

JavaScript에서 JSON.stringify()JSON.parse() 메서드는 JSON 문자열을 인코딩 및 디코딩하는 데 사용됩니다.

 const 게시물 = {
    아이디 : 1001 ,
    제목 : "JSON이란 무엇입니까?" ,
    저자 : {
        아이디 : 1 ,
        이름 : "제임스 워커"
    }
} ;

const encodeJson = JSON. 문자열화 ( 게시 ) ;

// {"id": 1001, "title": "JSON이란?", ...}
콘솔. 로그 ( 인코딩된Json ) ;

const decodedJson = JSON. 구문 분석 ( encodedJson ) ;

// 제임스 워커
콘솔. log ( decodedJson.author.name ) ; _

PHP

PHP에서 동등한 기능은 json_encode()json_decode() .

 $post = [
    "아이디" => 1001 ,
    "title" => "JSON이란 무엇입니까?" ,
    "저자" => [
        "아이디" => 1 ,
        "이름" => "제임스 워커"
    ]
] ;

$encodedJson = json_encode ( $post ) ;

// {"id": 1001, "title": "JSON이란?", ...}
에코 $encodedJson ;

$decodedJson = json_decode ( $encodedJson , true ) ;

// 제임스 워커
echo $decodedJson [ "저자" ] [ "이름" ] ;

파이썬

Python은 각각 직렬화 및 역직렬화하기 위해 json.dumps json.dumps()json.loads() 를 제공합니다.

 json 가져오기

게시물 = {
    "아이디" : 1001 ,
    "title" : "JSON이란 무엇입니까?" ,
    "작가" : {
        "아이디" : 1 ,
        "이름" : "제임스 워커"
    }
}

인코딩된Json = json. 덤프 ( 포스트 )

# {"id": 1001, "title": "JSON이란?", ...}
인쇄 ( 인코딩된Json )

디코딩된Json = json. 로드 ( encodedJson )

# 제임스 워커
인쇄 ( decodedJson [ "저자" ] [ "이름" ] )

루비

Ruby는 JSON.generateJSON.parse 를 제공합니다.

 "json"이 필요합니다

게시물 = {
    "아이디" => 1001 ,
    "title" => "JSON이란 무엇입니까?" ,
    "저자" => {
        "아이디" => 1 ,
        "이름" => "제임스 워커"
    }
}

encodeJson = JSON. 생성 ( 게시 )

# {"id": 1001, "title": "JSON이란?", ...}
인코딩된Json 을 넣 습니다.

DecodedJson = JSON. 구문 분석 ( encodedJson )

# 제임스 워커
DecodedJson [ "author" ] [ "name" ] 을 넣습니다.

JSON 제한 사항

JSON은 데이터 구조 내에서 값을 전달하는 데 중점을 둔 경량 형식입니다. 이렇게 하면 구문 분석이 빠르고 작업하기 쉽지만 좌절감을 유발할 수 있는 단점이 있음을 의미합니다. 다음은 몇 가지 가장 큰 문제입니다.

댓글 없음

JSON 데이터는 주석을 포함할 수 없습니다. 주석이 없으면 명확성이 떨어지고 문서를 다른 곳에 배치해야 합니다. 이로 인해 수정이 드물고 필드의 목적이 불분명할 수 있는 구성 파일과 같은 상황에 JSON이 적합하지 않을 수 있습니다.

스키마 없음

JSON을 사용하면 데이터에 대한 스키마를 정의할 수 없습니다. 예를 들어, id 가 필수 정수 필드임을 강제할 방법은 없습니다. 이는 의도하지 않은 형식의 데이터 구조로 이어질 수 있습니다.

참조 없음

필드는 데이터 구조의 다른 값을 참조할 수 없습니다. 이것은 종종 파일 크기를 증가시키는 반복을 유발합니다. 이전 블로그 게시물 예제로 돌아가서 다음과 같은 블로그 게시물 목록을 가질 수 있습니다.

 {
    "게시물": [
        {
            "아이디": 1001,
            "제목": "JSON이란 무엇입니까?",
            "작가": {
                "아이디": 1,
                "이름": "제임스 워커"
            }
        },
        {
            "아이디": 1002,
            "제목": "SaaS란 무엇입니까?",
            "작가": {
                "아이디": 1,
                "이름": "제임스 워커"
            }
        }
    ]
}

두 게시물의 작성자는 동일하지만 해당 개체와 관련된 정보를 복제해야 했습니다. 이상적인 세계에서 JSON 파서 구현은 다음과 유사한 입력에서 위에 표시된 구조를 생성할 수 있습니다.

 {
    "게시물": [
        {
            "아이디": 1001,
            "제목": "JSON이란 무엇입니까?",
            "저자": "{{ .authors.james }}"
        },
        {
            "아이디": 1002,
            "제목": "SaaS란 무엇입니까?",
            "저자": "{{ .authors.james }}"
        }
    ],
    "저자": {
        "제임스": {
            "아이디": 1,
            "이름": "제임스 워커"
        }
    }
}

이것은 현재 표준 JSON에서는 불가능합니다.

고급 데이터 유형 없음

지원되는 6개의 데이터 유형은 많은 공통 유형의 값을 생략합니다. JSON은 기본적으로 날짜, 시간 또는 지리적 위치를 저장할 수 없으므로 이 정보에 대한 형식을 직접 결정해야 합니다.

이로 인해 불편한 불일치와 극단적인 경우가 발생합니다. 애플리케이션이 2022-07-01T12:00:00+00:00 과 같이 타임스탬프를 문자열로 처리하지만 외부 API가 시간을 Unix epoch( 1657287000 ) 이후의 초로 표시하는 경우 각 형식.

JSON 대안

YAML은 최고의 JSON 대안입니다. 더 사람이 읽을 수 있는 프레젠테이션, 사용자 지정 데이터 유형 및 참조 지원이 있는 형식의 상위 집합입니다. JSON과 관련된 대부분의 사용성 문제를 해결하기 위한 것입니다.

YAML은 구성 파일과 DevOps, IaC 및 관찰 가능성 도구 내에서 널리 채택되었습니다. API의 데이터 교환 형식으로 덜 자주 사용됩니다. YAML은 상대적으로 복잡하기 때문에 신규 사용자가 접근하기 어렵습니다. 작은 구문 오류는 혼란스러운 구문 분석 실패를 유발할 수 있습니다.

프로토콜 버퍼(protobufs)는 구조화된 데이터를 직렬화하도록 설계된 또 다른 새로운 JSON 경쟁자입니다. Protobufs에는 데이터 유형 선언, 필수 필드 및 대부분의 주요 프로그래밍 언어에 대한 지원이 있습니다. 시스템은 네트워크를 통해 데이터를 전송하는 보다 효율적인 방법으로 인기를 얻고 있습니다.

요약

JSON은 6가지 데이터 유형을 인코딩할 수 있는 텍스트 기반 데이터 표현 형식입니다. JSON은 소프트웨어 개발 생태계의 필수 요소가 되었습니다. 모든 주요 프로그래밍 언어에서 지원되며 지난 20년 동안 개발된 대부분의 REST API에 대한 기본 선택이 되었습니다.

JSON의 단순성은 인기의 일부이지만 형식으로 달성할 수 있는 것에도 제한이 있습니다. 스키마, 주석, 개체 참조 및 사용자 지정 데이터 유형에 대한 지원이 부족하다는 것은 일부 애플리케이션에서 JSON으로 가능한 것보다 더 커질 수 있음을 의미합니다. YAML 및 Protobuf와 같은 새로운 대안은 이러한 문제를 해결하는 데 도움이 되었으며 XML은 데이터 스키마를 정의하고 장황한 내용을 신경 쓰지 않는 응용 프로그램의 경쟁자로 남아 있습니다.