ANSI C로 작성된 고성능 JSON 라이브러리입니다.
빠름 : 최신 CPU에서 초당 기가바이트의 JSON 데이터를 읽거나 쓸 수 있습니다.
이식성 : 플랫폼 간 호환성을 위해 ANSI C(C89)를 준수합니다.
Strict : RFC 8259 JSON 표준을 준수하여 엄격한 숫자 형식과 UTF-8 유효성 검사를 보장합니다.
확장 가능 : 주석, 후행 쉼표, NaN/Inf 및 사용자 정의 메모리 할당자를 허용하는 옵션을 제공합니다.
정확도 : int64
, uint64
및 double
숫자를 정확하게 읽고 쓸 수 있습니다.
유연성 : 무제한 JSON 중첩 수준, u0000
자 및 null로 끝나지 않는 문자열을 지원합니다.
조작 : JSON 포인터, JSON 패치, JSON 병합 패치를 사용한 쿼리 및 수정을 지원합니다.
개발자 친화적 : 단 하나의 h
및 하나의 c
파일로 쉽게 통합됩니다.
배열이나 객체는 연결된 목록과 같은 데이터 구조로 저장되므로 인덱스나 키로 요소에 액세스하는 것이 반복자를 사용하는 것보다 느립니다.
객체에 중복 키가 허용되며 키 순서가 유지됩니다.
JSON 구문 분석 결과는 변경할 수 없으므로 수정하려면 mutable copy
필요합니다.
벤치마크 프로젝트 및 데이터 세트: yyjson_benchmark
대부분의 JSON 필드가 컴파일 타임에 알려지면 simdjson의 새로운 On Demand
API가 더 빠릅니다. 이 벤치마크 프로젝트는 DOM API만 확인하며, 추후 새로운 벤치마크가 추가될 예정입니다.
트위터.json | 구문 분석(GB/초) | 문자열화(GB/초) |
---|---|---|
yyjson(연구소) | 1.80 | 1.51 |
yyjson | 1.72 | 1.42 |
심디슨 | 1.52 | 0.61 |
사존 | 1.16 | |
rapidjson(연구소) | 0.77 | |
rapidjson(utf8) | 0.26 | 0.39 |
cjson | 0.32 | 0.17 |
얀손 | 0.05 | 0.11 |
트위터.json | 구문 분석(GB/초) | 문자열화(GB/초) |
---|---|---|
yyjson(연구소) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
심디슨 | 2.19 | 0.80 |
사존 | 1.74 | |
rapidjson(연구소) | 0.75 | |
rapidjson(utf8) | 0.30 | 0.58 |
cjson | 0.48 | 0.33 |
얀손 | 0.09 | 0.24 |
대화형 차트가 포함된 추가 벤치마크 보고서(2020-12-12 업데이트)
플랫폼 | CPU | 컴파일러 | OS | 보고서 |
---|---|---|---|---|
인텔 NUC 8i5 | 코어 i5-8259U | MSVC 2019 | 윈도우 10 2004 | 차트 |
인텔 NUC 8i5 | 코어 i5-8259U | 클랭 10.0 | 우분투 20.04 | 차트 |
인텔 NUC 8i5 | 코어 i5-8259U | gcc 9.3 | 우분투 20.04 | 차트 |
AWS EC2 c5a.large | AMD EPYC 7R32 | gcc 9.3 | 우분투 20.04 | 차트 |
AWS EC2 t4g.medium | 중력자2(ARM64) | gcc 9.3 | 우분투 20.04 | 차트 |
애플 아이폰 12 프로 | A14 (ARM64) | 클랭 12.0 | iOS 14 | 차트 |
다음을 갖춘 최신 프로세서:
높은 명령어 수준 병렬성
우수한 분기 예측기
잘못 정렬된 메모리 액세스에 대한 낮은 페널티
우수한 최적화 프로그램(예: clang)을 갖춘 최신 컴파일러
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// JSON을 읽고 rootyyjson_doc 가져오기 *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// 루트 가져오기["name"]yyjson_val *name = yyjson_obj_get(root, "name");printf("이름: %sn", yyjson_get_str(name));printf("이름 길이:%dn", (int)yyjson_get_len(name));// 루트 가져오기["star "]yyjson_val *star = yyjson_obj_get(root, "star");printf("star: %dn", (int)yyjson_get_int(star));// 루트["hits"] 가져오기, arrayyyjson_val을 반복 *hits = yyjson_obj_get(root, "hits");size_t idx, max;yyjson_val *hit;yyjson_arr_foreach(hits, idx, 최대, 적중) {printf("hit%d: %dn", (int)idx, (int)yyjson_get_int(hit)); }// docyyjson_doc_free(doc)를 해제합니다.// 모든 함수는 NULL 입력을 허용하고 오류 시 NULL을 반환합니다.
// 변경 가능한 docyyjson_mut_doc 생성 *doc = yyjson_mut_doc_new(NULL);yyjson_mut_val *root = yyjson_mut_obj(doc);yyjson_mut_doc_set_root(doc, root);// root["name"] 및 root["star"]yyjson_mut_obj_add_str(doc, 루트, "이름", "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// 배열로 root["hits"] 설정int hit_arr[] = {2, 2, 1, 3};yyjson_mut_val *hits = yyjson_mut_arr_with_sint32( doc, hit_arr, 4);yyjson_mut_obj_add_val(doc, 루트, "히트", 히트);// 문자열로, minifiedconst char *json = yyjson_mut_write(doc, 0, NULL);if (json) {printf("json: %sn", json); // {"name":"Mash","star":4,"hits":[2,2,1,3]}free((void *)json); }// docyyjson_mut_doc_free(doc)를 해제합니다.
// JSON 파일을 읽고 주석과 후행 쉼표를 허용합니다. flg = YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS;yyjson_read_err err;yyjson_doc *doc = yyjson_read_file("/tmp/config.json", flg, NULL, &err);// 루트 객체에 대해 반복if (doc) {yyjson_val *obj = yyjson_doc_get_root(doc);yyjson_obj_iter iter;yyjson_obj_iter_init(obj, &iter);yyjson_val *key, *val;while ((key = yyjson_obj_iter_next(&iter))) {val = yyjson_obj_iter_get_val(key);printf("%s: %sn", yyjson_get_str(key), yyjson_get_type_desc(val)); } } else {printf("읽기 오류(%u): %s 위치: %ldn", err.code, err.msg, err.pos); }// docyyjson_doc_free(doc)를 해제합니다.
// JSON 파일을 가변 docyyjson_doc *idoc = yyjson_read_file("/tmp/config.json", 0, NULL, NULL);yyjson_mut_doc *doc = yyjson_doc_mut_copy(idoc, NULL);yyjson_mut_val *obj = yyjson_mut_doc_get_root(doc)로 읽습니다. ;// 루트에서 null 값을 제거합니다. objectyyjson_mut_obj_iter iter;yyjson_mut_obj_iter_init(obj, &iter);yyjson_mut_val *key, *val;while ((key = yyjson_mut_obj_iter_next(&iter))) {val = yyjson_mut_obj_iter_get_val(key);if (yyjson_mut_is_null(val)) {yyjson_mut_obj_iter_remove(&iter); } }// json을 예쁘게 작성하고 unicodeyyjson_write_flag flg = YYJSON_WRITE_PRETTY | YYJSON_WRITE_ESCAPE_UNICODE;yyjson_write_err err;yyjson_mut_write_file("/tmp/config.json", doc, flg, NULL, &err);if (err.code) {printf("쓰기 오류(%u): %sn", err.code, 오류.msg); }// docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc)를 해제합니다.
최신(공개되지 않은) 문서는 doc 디렉토리에서 액세스할 수 있습니다. 릴리스 버전에 대해 사전 생성된 Doxygen HTML은 여기에서 볼 수 있습니다:
홈 페이지
빌드 및 테스트
API 및 샘플 코드
데이터 구조
변경 내역
yyjson을 다른 언어에 노출하거나 주요 기능을 위해 내부적으로 yyjson을 사용하는 프로젝트의 대략적인 목록입니다. yyjson을 사용하는 프로젝트가 있는 경우 자유롭게 PR을 열어 이 목록에 추가하세요.
프로젝트 | 언어 | 설명 |
---|---|---|
py_yyjson | 파이썬 | yyjson에 대한 Python 바인딩 |
orjson | 파이썬 | 선택적 yyjson 백엔드가 있는 Python용 JSON 라이브러리 |
cpp-yyjson | C++ | yyjson 백엔드가 있는 C++ JSON 라이브러리 |
반영-cpp | C++ | 구조체에서 자동화된 필드 이름 검색을 통한 직렬화를 위한 C++ 라이브러리 |
yyjsonr | 아르 자형 | yyjson에 대한 R 바인딩 |
아난다 | 스위프트 | yyjson을 기반으로 한 JSON 모델 디코딩 |
오리디비 | C++ | DuckDB는 처리 중인 SQL OLAP 데이터베이스 관리 시스템입니다. |
빨리 가져오기 | 기음 | 시스템 정보를 가져와서 보기 좋게 표시하는 네오페치 같은 도구입니다. |
Zrythm | 기음 | yyjson을 사용하여 JSON 프로젝트 파일을 직렬화하는 디지털 오디오 워크스테이션 |
더인간적인 | 기음 | 추천을 받는 사람의 고유성에 초점을 맞춘 추천 엔진 |
mruby-yyjson | 므루비 | yyjson을 사용하는 mruby용 효율적인 JSON 구문 분석 및 직렬화 라이브러리 |
YYJSON.jl | 줄리아 | yyjson에 대한 Julia 바인딩 |
문서 페이지를 추가합니다.
CI 및 codecov용 GitHub 워크플로를 추가합니다.
더 많은 테스트를 추가하세요: valgrind, sanitizer, fuzzing.
JSON을 쿼리하고 수정하기 위해 JSON 포인터를 지원합니다.
JSON 리더 및 라이터용 RAW
유형을 추가합니다.
실수 출력 정밀도를 제한하는 옵션을 추가합니다.
JSON5를 지원하는 옵션을 추가합니다(가능한 경우).
두 개의 JSON 문서를 비교하는 함수를 추가합니다.
성능 최적화에 대한 문서를 추가합니다.
ABI 안정성을 보장합니다.
이 프로젝트는 MIT 라이선스로 배포됩니다.