JSON 스트리밍

JSON streaming

JSON 스트리밍은 하위 수준의 스트림 지향 프로토콜(TCP 등)에 구축된 JSON 객체를 구분하기 위한 통신 프로토콜로 구성되며, 이는 서버와 클라이언트가 동일한 JSON 객체를 사용할 때(예: 은연중에 코드화됨) 개별 JSON 객체가 인식되도록 보장한다.이것은 JSON이 비협조적 프로토콜이기 때문에 필요하다. (두 JSON 객체의 연결은 유효한 JSON 객체를 생성하지 않는다.)

소개

JSON은 시스템 간에 객체 데이터를 교환할 때 널리 사용되는 형식이다.주식 조회기응용 프로그램 로그 기록과 같은 단일 연결을 통해 전송되는 물체의 스트림이 필요한 경우가 많다.[1]이러한 경우, JSON 인코딩된 한 개체가 어디에서 끝나고 다음 개체가 시작되는지 확인할 필요가 있다.기술적으로 이것은 골격이라고 알려져 있다.

이를 달성하기 위한 네 가지 일반적인 방법이 있다.

  • 없이 포맷된 JSON 개체를 보내고 새 줄을 구분 기호로 사용하십시오.[2]
  • 레코드 구분 기호 제어 문자와 연결된 JSON 개체를 구분 기호로 전송하십시오.[3]
  • 구분 기호 없이 연결된 JSON 개체를 보내고 스트리밍 파서를 사용하여 개체를 추출하십시오.
  • 길이가 앞에 붙은 JSON 개체를 보내고 스트리밍 파서에 의존하여 추출하십시오.

라인 구분 JSON

JSON 스트리밍의 등가 형식에 대한 세 가지 용어는 다음과 같다.

  • 라인 구분 JSON(LDJSON),
  • 뉴라인 구분(NDJSON) 및
  • JSON 라인(JSONL)

스트리밍은 JSON 형식이 원시 값 내에서 리턴 및 뉴라인 문자를 허용하지 않는다는 사실을 이용한다(이 문자열에서는 다음 문자열로 이스케이프해야 함).\r그리고\n(각각) 및 대부분의 JSON 포맷터는 리턴과 새로운 라인을 포함하여 공백이 포함되지 않는 것으로 기본 설정된다.이러한 기능을 통해 뉴라인 문자 또는 리턴 문자 및 뉴라인 문자 시퀀스를 구분 기호로 사용할 수 있다.

이 형식은 ndjson.org에서 지정되며 JSON 라인 웹사이트에서 문서화된다.

이 예는 두 개의 JSON 개체를 보여준다(각 줄의 끝에 있는 암시적 뉴라인 문자는 표시되지 않음).

{"썸":"thing\n"} {"5월":{"include":"nested","objects":["그리고","arrays"]}} 

구분 기호로 뉴라인을 사용하면 이 형식이 기존의 라인 지향 Unix 도구와 매우 잘 작동할 수 있다.

예를 들어 로그 파일은 다음과 같이 보일 수 있다.

{"ts":"2020-06-18T10:44:12","started":{"pid":45678}} {"ts":"2020-06-18T10:44:13","logged_in":{"username":"foo"},"연결":{"addr":"1.2.3.4","좌현":5678}} {"ts":"2020-06-18T10:44:15","등록된":{"username":"바","email":"bar@example.com"},"연결":{"addr":"2.3.4.5","좌현":6789}} {"ts":"2020-06-18T10:44:16","logged_out":{"username":"foo"},"연결":{"addr":"1.2.3.4","좌현":5678}} 

날짜, 사용자 이름, 작업, IP 주소 등에 따라 정렬하기 매우 쉬운 것.

구분 기호 JSON 기록

레코드 구분 기호로 구분된 JSON 스트리밍을 사용하면 JSON 포맷터가 공백을 제외할 필요 없이 JSON 텍스트 시퀀스를 구분할 수 있다.JSON 텍스트 시퀀스는 제어 문자를 포함할 수 없으므로 레코드 구분 문자를 사용하여 시퀀스를 구분할 수 있다.또한 각 JSON 텍스트 시퀀스에 라인 피드 문자를 입력하여 자체 구분(숫자, 참, 거짓, null)이 아닌 최상위 JSON 개체를 적절하게 처리할 수 있도록 하는 것이 좋다.

이 형식을 JSON 텍스트 시퀀스 또는 MIME 유형이라고도 함 application/json-seq, 그리고 IETF RFC 7464에 공식적으로 설명되어 있다.

아래의 예는 레코드 구분 기호 제어 문자를 나타내는 ␞과 라인 피드 문자를 나타내는 ␊을 가진 두 개의 JSON 개체를 보여준다.

{"썸":"thing\n"} {   "5월": {     "include": "nested",     "objects": [       "그리고",       "arrays"     ]   } } 

연결 JSON

연결된 JSON 스트리밍은 송신자가 각 JSON 객체를 구분자 없이 스트림에 간단하게 쓸 수 있게 해준다.종료 문자를 파싱할 때 각 JSON 개체를 인식하고 내보낼 있는 파서를 사용하여 수신기에 의존한다.결합된 JSON은 새로운 형식이 아니라 단순히 구분 기호 없이 여러 JSON 객체를 스트리밍하기 위한 이름일 뿐이다.

이 형식의 장점은 인간의 가독성을 위해 예쁘게 인쇄하는 등 내장된 뉴라인 문자로 포맷된 JSON 객체를 처리할 수 있다는 점이다.예를 들어, 이 두 입력은 모두 유효하며 동일한 출력을 생성한다.

{"썸":"thing\n"}{"5월":{"include":"nested","objects":["그리고","arrays"]}} 
{   "썸": "thing\n" } {   "5월": {     "include": "nested",     "objects": [       "그리고",       "arrays"     ]   } } 

라인 기반 입력에 의존하는 구현에서는 각 JSON 객체 다음에 새로운 라인 문자가 필요할 수 있다. 그 외의 경우, 라인은 파서에게 전달되지 않고 입력 버퍼에 남아 있을 수 있다.이는 뉴라인 문자로 JSON 객체를 종료하는 것이 매우 일반적이기 때문에 거의 이슈로 인식되지 않는다.

길이선호 JSON

길이 접두사 또는 프레임 JSON 스트리밍은 송신자가 각 메시지의 길이를 명시적으로 명시할 수 있도록 한다.각 길이 n을 인식한 후 다음 n바이트를 읽어 JSON으로 파싱할 수 있는 파서를 사용하여 수신기에 의존한다.

이 형식의 장점은 파서에게 구분자를 검색하도록 강요하기보다는 각 메시지의 정확한 길이를 명시적으로 명시해 파싱 속도를 높일 수 있다는 점이다.길이 접두사 JSON은 또한 접두사 길이가 파서에게 JSON 문자열을 구문 분석하기 전에 예상할 바이트 수를 정확히 알려주기 때문에 하나의 "메시지"를 임의 청크로 나눌 수 있는 TCP 애플리케이션에 적합하다.

이 예에서는 두 개의 길이 앞에 있는 JSON 객체(각 길이가 다음 JSON 문자열의 바이트 길이임)를 보여 준다.

18{"썸":"thing\n"}55{"5월":{"include":"nested","objects":["그리고","arrays"]}} 

비교

라인 구분 JSON은 전통적인 라인 지향 툴과 매우 잘 작동한다.

결합된 JSON은 인쇄된 JSON과 함께 작동하지만 구문 분석에는 더 많은 노력과 복잡성이 필요하다.전통적인 라인 지향 도구로는 잘 작동하지 않는다.연결된 JSON 스트리밍은 라인 구분 JSON 스트리밍의 상위 집합이다.

길이 접두사 JSON은 예쁘게 인쇄된 JSON과 함께 작동한다.기존의 라인 지향 툴에서는 잘 작동하지 않지만, 라인 구분 또는 연결 스트리밍에 비해 성능상의 이점을 제공할 수 있다.그것은 또한 구문 분석하는 것이 더 간단할 수 있다.

호환성.

라인 구분 JSON은 연결된 JSON을 처리할 수 있는 파서가 읽을 수 있다.JSON 객체 에 새로운 선이 포함된 연결된 JSON은 선으로 구분된 JSON 파서로 읽을 수 없다.

"라인 구분 JSON"과 "뉴라인 구분 JSON"이라는 용어는 내장된 뉴라인 지원 여부를 명확히 하지 않고 사용하는 경우가 많다.

과거에 NDJ 규격("뉴라인 구분 JSON")[4]은 특정 행의 처음 두 문자가 "/"인 경우 코멘트를 포함하도록 허용했다.코멘트가 포함된 경우 표준 JSON 파서에서는 이를 사용할 수 없었다.규격의 현재 버전("NDJSON - 뉴라인 구분 JSON ")[5]은 더 이상 설명을 포함하지 않는다.

결합된 JSON은 jq와 같은 적합한 JSON 유틸리티에 의해 라인 구분 JSON으로 변환할 수 있다.예를 들어,

jq --js-output. < concatenced.json > line.json

애플리케이션 및 도구

라인 구분 JSON

구분 기호 JSON 기록

  • jq는 레코드 구분 기호로 구분된 JSON 텍스트를 만들고 읽을 수 있다.

연결 JSON

  • Node.js용 JSON 스트리밍 파서/시리얼라이저 모듈 연결
  • 잭슨_(API)은 연결된 JSON 콘텐츠를 읽고 쓸 수 있다.
  • jq 경량 플렉시블 명령줄 JSON 프로세서
  • Java용 Noggit Solr의 스트리밍 JSON 파서
  • Yajl – 그러나 또 다른 JSON 라이브러리.YAJL은 ANSI C로 작성된 소형 이벤트 구동(SAX-style) JSON 파서(Parser)이며, 검증이 가능한 소형 JSON 발전기다.
  • 아두이노Json은 연결된 JSON을 지원하는 C++ 라이브러리다.
  • GSON JsonStreamParser.java는 연결된 JSON을 읽을 수 있다.

길이선호 JSON

  • 스트림을 통해 길이 접두사 JSON 메시지를 인코딩 및 디코딩하기 위한 Missive Fast, 경량 라이브러리
  • 네이티브 메시징 WebExtension 네이티브 메시징

참조

  1. ^ Ryan, Film Grain. "How We Built Filmgrain, Part 2 of 2". filmgrainapp.com. Retrieved 4 July 2013.
  2. ^ "JSON Lines".
  3. ^ "RFC 7464".
  4. ^ "Newline Delimited JSON".
  5. ^ "NDJSON - Newline delimited JSON". 2 June 2021.
  6. ^ "Centralized Logging with Monolog, Logstash, and Elasticsearch".
  7. ^ "NDJSON – Newline-delimited JSON, A standard for delimiting JSON in stream protocols".