UFO ET IT

JSON 용 스트리밍 API가 있습니까?

ufoet 2020. 11. 14. 11:23
반응형

JSON 용 스트리밍 API가 있습니까?


DOM이 JSON을 구문 분석하는 유일한 방법입니까?


일부 JSON 파서는 증분 ( "스트리밍") 파서를 제공합니다. Java의 경우 최소한 json.org 페이지의 다음 파서가 이러한 인터페이스를 제공합니다.

( 다른 답변에서 언급 한 Software Monkey의 파서 외에도 )

사실, 너무 많은 JSON 파서가이 간단한 저수준 인터페이스를 제공하지 않는다는 것은 다소 이상합니다. 결국 이미 저수준 파싱을 구현해야하므로 노출하지 않는 것이 좋습니다.

편집 (2011 년 6 월) : Gson에도 자체 스트리밍 API가 있습니다 (gson 1.6 포함).


DOM에서는 파서가 작업하기 전에 한 번에 전체 문서를 읽는다고 가정합니다. DOM은 요즘 XML을 암시하는 경향이 있지만 IMO는 실제로 정확한 추론이 아닙니다.

따라서 "예"라는 질문에 대한 답변으로 스트리밍 API와 "아니오"가 있습니다. DOM이 유일한 방법은 아닙니다. 즉, JSON 문서를 스트림으로 처리하는 것은 많은 객체가 단순한 필드 / 값 쌍이 아니라 처리하기 위해 구문 분석해야하는 값으로 다른 객체를 포함한다는 점에서 문제가 자주 발생하며 이는 결국 재귀적인 일이되는 경향이 있습니다. 그러나 간단한 메시지의 경우 스트림 / 이벤트 기반 파서로 유용한 작업을 수행 할 수 있습니다.

JSON에 대한 풀 이벤트 파서를 작성했습니다 (한 클래스, 약 700 줄). 그러나 내가 본 다른 대부분은 문서 지향적입니다. 파서 위에 구축 한 레이어 중 하나는 문서 판독기인데 약 30 LOC가 필요했습니다. 나는 실제로 문서 로더로 내 파서를 사용한 적이 있습니다 (위의 이유 때문에).

인터넷을 검색하면 JSON에 대한 pull and push 기반 파서를 찾을 수있을 것이라고 확신합니다.

편집 : 다운로드를 위해 파서 를 내 사이트에 게시했습니다 . 작동하는 컴파일 가능한 클래스와 완전한 예제가 포함되어 있습니다.

EDIT2 : JSON 웹 사이트도 살펴보고 싶을 것 입니다.


stefanB가 언급했듯이 http://lloyd.github.com/yajl/ 은 JSON 구문 분석을위한 C 라이브러리입니다. 다른 언어에 대해 해당 페이지에 언급 된 많은 래퍼가 있습니다.

  • yajl-ruby-YAJL 용 루비 바인딩
  • yajl-objc-YAJL에 대한 Objective-C 바인딩
  • YAJL IO 바인딩 (IO 언어 용)
  • Python 바인딩은 py-yajl 또는 yajl-py의 두 가지 유형으로 제공됩니다.
  • yajl-js-node.js 바인딩 (github에 미러링 됨).
  • lua-yajl-루아 바인딩
  • ooc-yajl-ooc 바인딩
  • yajl-tcl-tcl 바인딩

그들 중 일부는 스트리밍을 허용하지 않을 수 있지만 대부분은 확실히 허용합니다.


면책 조항 : 내 프로젝트를 제안하고 있습니다.

SAX와 DOM의 일부 기능을 결합한 Javascript로 스트리밍 JSON 파서를 유지합니다.

Oboe.js 웹 사이트

아이디어는 스트리밍 구문 분석을 허용하는 것이지만 프로그래머가 원시 SAX와 같은 다양한 이벤트를 수신 할 필요는 없습니다. 나는 SAX를 좋아하지만 대부분의 사람들이 필요로하는 것에 대해 상당히 낮은 수준 인 경향이 있습니다. JSONPath 패턴을 등록하여 JSON 스트림에서 흥미로운 노드를 수신 할 수 있습니다.

코드는 여기 Github에 있습니다.

Oboe.js Github 페이지


순수한 자바 스크립트와 node.js와 브라우저 모두에서 실행되는 라이브러리를 사용하려면 클라리넷을 사용해 볼 수 있습니다.

https://github.com/dscape/clarinet

파서는 이벤트 기반이며 스트리밍이므로 대용량 파일을 처리 할 수 ​​있습니다. API는 sax에 매우 가깝고 코드는 sax-js에서 분기됩니다.


LitJSON은 스트리밍 스타일 API를 지원합니다. 설명서 에서 인용 :

"일부 개발자에게 친숙 할 수있는 JSON 데이터 처리에 대한 대체 인터페이스는 스트림과 같은 방식으로 데이터를 읽고 쓸 수있는 클래스를 사용하는 것입니다. 이러한 클래스는 JsonReaderJsonWriter.

"이 두 가지 유형은 사실이 라이브러리의 기초이며 JsonMapper유형이 그 위에 구축되므로 개발자는 어떤면에서 판독기 및 작성기 클래스를 LitJSON의 저수준 프로그래밍 인터페이스로 생각할 수 있습니다."


다음은 JSON 스트림을 구문 분석하고 처리하기위한 NodeJS NPM 라이브러리입니다. https://npmjs.org/package/JSONStream


특별히 Python을 찾고 있다면 ijson은이 를 지원한다고 주장합니다. 그러나 이것은 파서 일 뿐이므로 json을 스트림으로 생성 할 수있는 Python을위한 어떤 것도 발견하지 못했습니다.

C ++의 경우 스트리밍 방식으로 구문 분석과 생성을 모두 지원한다고 주장하는 rapidjson 이 있습니다.


For Python, an alternative (apparently lighter and more efficient) to ijson is jsaone (see that link for rough benchmarks, showing that jsaone is approximately 3x faster).

DISCLAIMER: I'm the author of jsaone, and the tests I made are very basic... I'll be happy to be proven wrong!


Answering the question title: YAJL a JSON parser library in C:

YAJL remembers all state required to support restarting parsing. This allows parsing to occur incrementally as data is read off a disk or network.

So I guess using yajl to parse JSON can be considered as processing stream of data.


In reply to your 2nd question, no, many languages have JSON parsers. PHP, Java, C, Ruby and many others. Just Google for the language of your choice plus "JSON parser".

참고URL : https://stackoverflow.com/questions/444380/is-there-a-streaming-api-for-json

반응형