C를 사용하여 JSON 구문 분석 [닫힘]


82

C에서 JSON을 구문 분석하는 좋은 방법을 찾으려고합니다. 정말 큰 라이브러리 나 아무것도 필요하지 않습니다. 최소한의 기능을 갖춘 작고 가벼운 것이지만 좋은 문서입니다.

나를 가리킬 수있는 사람이 있습니까?


5
Linux 배포판을 사용하고 있습니까?
Nick


Objective-C 라이브러리가 작동합니까? obj-c에서 사용하기 쉽고 작을 때 Mac에서 TouchJson을 사용합니다.
Nick

"최소한"이라고 말할 때 실제로 얼마나 최소한으로 갈 수 있습니까? 일부는 다양한 유니 코드 인코딩을 처리 할 일부 단지 UTF-8, 일부 단지에주의하여 ASCII "형식 문자"등 {, [, ], }, ,, ", 및 백 슬래시. 그들은 유니 코드 이스케이프 시퀀스를 당신에게 맡길 수도 있고 안 할 수도 있고, 숫자가 허용 가능한 유니 코드 범위 내에 있는지 등을 확인하기 위해 당신에게 맡길 수도 있습니다. 그런 다음 임의의 JSON을 트리로 파싱하는 것과 알려진 JSON을 C로 파싱하는 것 사이에는 큰 차이가 있습니다. 구조체.
hippietrail

답변:


74

Json은 시작하기에 큰 언어가 아니므로 라이브러리는 작을 가능성이 높습니다 (적어도 Xml 라이브러리보다 작음).

Json.org에 링크 된 수많은 C 라이브러리가 있습니다 . 아마도 그들 중 하나가 당신을 위해 잘 작동 할 것입니다.


3
네 답변 감사합니다! 나는 그것들을 많이 살펴 봤고 그것들은 문서화 / 유지 관리가 매우 부실했습니다. 나는 :) ... 내가 하나의 통합을 통해 고통을하기 전에 내가 여기에 시도 할 것이라고 생각
dshipper

2
@dshipper : sourceforge.net/projects/cjson 은 요구 사항을 고려할 때 다소 유망 해 보입니다. 개인적으로이 라이브러리를 사용하지 않았기 때문에 추천 할 수 없습니다. 하나의 라이브러리에 대한 제안 만 어쨌든 의견, 아닌 확실한 대답 :) 일
Merlyn 모건 - 그레이엄

5
@dshipper : 가볍고 잘 문서화되어있는 jansson에 대해 좋은 경험을했습니다. digip.org/jansson/doc/2.1
디트리히 엡

1
@Dietrich, dshipper : 방금 Jansson을 봤습니다. 나는 그것이 잘 문서화되고 아주 작으며 좋은 테스트 스위트를 가지고있는 것처럼 보인다는 데 동의합니다. 아마도 귀하의 요구 사항에도 맞을 것입니다. 하지만 작동하는 라이브러리가 여러 개있을 것입니다. 나는 당신에게 당신이 몇 가지 라이브러리를 시도 할 수 최선로 JSON 종속성을 추상적 추천, 당신에게 가장 슬픔 :)주는 볼 것
Merlyn 모건 - 그레이엄

그래서 @dshipper, sourceforge.net/projects/cjson 또는 무엇을 갔습니까?
Mawg는 분석 재개 모니카 말한다

37

cJSON 은 괜찮은 API를 가지고 있으며 크기가 작습니다 (파일 2 개, ~ 700 줄). 내가 처음에 본 다른 JSON 파서 중 상당수는 거대했습니다. JSON을 파싱하고 싶습니다.

편집 : 우리는 수년에 걸쳐 cJSON을 약간 개선 했습니다.


10

Jsmn은 매우 최소한이며 작업 할 수있는 기능은 두 가지뿐입니다.

http://zserge.bitbucket.org/jsmn.html


jsmn의 한 가지 단점은 유니 코드 이스케이프 시퀀스를 처리하지 않는다는 것입니다. 소스에서 볼 수 있습니다 : /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail 2013 년

14
또한 그것이하는 일은 당신에게 토큰을 제공하는 것입니다. 행운을 빕니다. 그것은 당신이 할 수있는 가장 작고 효율적인 일처럼 보이지만 많은 일을하지 않습니다.
NateS 2013 년

분명히 그들은 유니 코드 기호에 대한 "TODO"를 수정했습니다.
aviggiano

9

NXJSON 은 모든 기능을 갖추고 있지만 매우 작은 (최대 400 줄의 코드) JSON 파서로 API를 사용하기 쉽습니다.

const nx_json* json=nx_json_parse_utf8(code);
printf("hello=%s\n", nx_json_get(json, "hello")->text_value);
const nx_json* arr=nx_json_get(json, "my-array");
int i;
for (i=0; i<arr->length; i++) {
  const nx_json* item=nx_json_item(arr, i);
  printf("arr[%d]=(%d) %ld\n", i, (int)item->type, item->int_value);
}
nx_json_free(json);

NXJSON의 개발자 인 것처럼 보이므로 cJSON 또는 다른 옵션과 비교하는 방법에 대해 언급 할 수 있습니까?
Matt

5
간단한 방법으로 수행되는 간단한 작업-이것은 대부분의 다른 파서와 NXJSON의 주요 차이점입니다. cJSON도 간단하지만 json 파서 외에도 json 생성자 및 직렬 변환기도 포함됩니다. cJSON은 모든 문자열을 복제하므로 더 많은 메모리가 필요하지만 NXJSON은 원본 콘텐츠를 삭제하는 모든 조작을 수행합니다. 작업에 따라 이러한 차이는 장점 또는 단점으로 간주 될 수 있습니다. NXJSON은 구성 파일을 구문 분석하는 데 유용한 주석도 처리합니다.
Yaroslav Stavnichiy

9

Jansson을 볼 수 있습니다

웹 사이트는 다음과 같이 설명합니다. Jansson은 JSON 데이터를 인코딩, 디코딩 및 조작하기위한 C 라이브러리입니다. 특징 :

  • 간단하고 직관적 인 API 및 데이터 모델
  • JSON으로 인코딩 및 디코딩 가능
  • 포괄적 인 문서
  • 다른 라이브러리에 대한 종속성 없음
  • 전체 유니 코드 지원 (UTF-8)
  • 광범위한 테스트 스위트

1
직접 Github의 링크 : github.com/akheron/jansson
레이 Hulha

jsmn속도 [1] 때문에 사용하고 싶었지만 인코딩을 지원하지 않습니다. 또한 Jansson은 사용하기 정말 쉽습니다. --- [1] translate.google.it/…
Marco Sulla

OjC는 빠르고 인코딩을 지원합니다. github.com/ohler55/ojc
Peter Ohler

얀손은 내 이동이다 C에서 JSON을 구문 분석
케네스 WILKE을

8

작업 프로젝트에 JSON-C 를 사용 했으며 권장합니다. 경량이며 오픈 라이선스로 출시됩니다.

문서는 배포에 포함되어 있습니다. 기본적으로 *_addJSON 객체를 생성하는 *_put함수, 메모리를 해제하는 동등한 함수, 유형 및 출력 객체를 문자열 표현으로 변환하는 유틸리티 함수가 있습니다.

라이선스를 통해 프로젝트에 포함 할 수 있습니다. 우리는 이것을 메인 빌드와 연결된 정적 라이브러리로 JSON-C를 컴파일하는 방식으로 사용했습니다. 이렇게하면 종속성 (Xcode 설치 제외)에 대해 걱정할 필요가 없습니다.

JSON-C는 OS X (x86 Intel) 및 Linux (x86 Intel)에서 우연없이 우리를 위해 구축되었습니다. 프로젝트를 이식 할 수 있어야한다면 시작하는 것이 좋습니다.


6

임의의 JSON 구조를 파싱해야합니까, 아니면 애플리케이션에 특정한 데이터 만 파싱해야합니까? 후자의 경우 JSON 키를 값에 매핑하는 해시 테이블 / 맵 구조를 생성 할 필요가 없으므로 훨씬 가볍고 효율적으로 만들 수 있습니다. 대신 데이터를 구조체 필드 등에 직접 저장할 수 있습니다.


2
이것은 C와 같은 비 동적 언어로 JSON을 사용할 때 매우 중요한 점입니다. 그러나 그것은 대답이 아니므로 실제로 OP의 질문에 대한 주석이어야합니다.
hippietrail

창의적 사고에 +1! 그래도 어떻게 작동할까요? 이것은 여전히 ​​매우 가벼운 라이브러리를 사용할 수 없을까요? 구조 필드로 파싱하는 것은 여전히 ​​상당한 작업처럼 들립니다.
CL22
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.