{"id":20464482,"url":"https://github.com/bytedance/sonic-cpp","last_synced_at":"2025-05-15T01:05:55.835Z","repository":{"id":63166540,"uuid":"564651074","full_name":"bytedance/sonic-cpp","owner":"bytedance","description":"A fast JSON serializing \u0026 deserializing library, accelerated by SIMD.","archived":false,"fork":false,"pushed_at":"2025-03-07T03:18:46.000Z","size":15808,"stargazers_count":911,"open_issues_count":22,"forks_count":102,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-05-10T04:02:02.212Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bytedance.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-11T07:11:42.000Z","updated_at":"2025-05-09T03:59:54.000Z","dependencies_parsed_at":"2024-09-12T11:30:33.355Z","dependency_job_id":"0f183c79-250a-4c9a-bdd1-db2f03862c2d","html_url":"https://github.com/bytedance/sonic-cpp","commit_stats":{"total_commits":53,"total_committers":11,"mean_commits":4.818181818181818,"dds":0.5471698113207547,"last_synced_commit":"91f84fcc3005170a2a53209b84fcdaae5f5cd465"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2Fsonic-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2Fsonic-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2Fsonic-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bytedance%2Fsonic-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bytedance","download_url":"https://codeload.github.com/bytedance/sonic-cpp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254254039,"owners_count":22039792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T13:15:22.721Z","updated_at":"2025-05-15T01:05:55.795Z","avatar_url":"https://github.com/bytedance.png","language":"C++","readme":"# Sonic-Cpp\n----\nA fast JSON serializing \u0026 deserializing library, accelerated by SIMD.\n\n[![clang-format Check](https://github.com/bytedance/sonic-cpp/actions/workflows/clang-format-check.yml/badge.svg)](https://github.com/bytedance/sonic-cpp/actions/workflows/clang-format-check.yml)\n[![Test](https://github.com/bytedance/sonic-cpp/actions/workflows/test_x86.yml/badge.svg)](https://github.com/bytedance/sonic-cpp/actions/workflows/test_x86.yml)\n[![codecov](https://codecov.io/gh/bytedance/sonic-cpp/branch/master/graph/badge.svg)](https://codecov.io/gh/bytedance/sonic-cpp)\n\n## Requirement\n- c++11 or above\n- x86 platform with AVX2 instruction\n- GCC or LLVM compiler (not support MSVC compiler now)\n- Linux OS\n\n## Features\n- Complete APIs for JSON value manipulation\n- Fast on JSON serializing and parsing\n- Support parse ondemand\n\n## Benchmarks\n\n\n- use CMake\n```\ncmake -S . -B build -DBUILD_BENCH=ON\ncmake --build build --target bench -j\n./build/benchmark/bench\n```\n\n- use bazel\n```\nbazel run :benchmark --compilation_mode=opt\n```\n\n### Performance by sonic benchmark\n\n- Run\n\n```shell\n# build by bazel\npython3 ./scripts/tools/draw-decode-encode.py\n```\n- Result\n\nParsing Performance\n![image](docs/images/compare_Decode.png)\n\nSerializing performance\n![image](docs/images/compare_Encode.png)\n\n### Performance by third-party benchmark\n\nBelow data is test by https://github.com/miloyip/nativejson-benchmark:\n\nParsing Performance\n![image](docs/images/parse.png)\n\nSerializing Performance\n![image](docs/images/serialize.png)\n\n## API Document\nMake sure Doxygen 1.8.13 or higher version has been installed. Then following:\n\n```shell\nmdkir api-doc \u0026\u0026 cd api-doc\ndoxygen ../Doxyfile\n```\n\n## Design\n\nSonic-cpp parses JSON into a compact document tree. The document structure is as follows:\n\n![image](docs/images/dom.png)\n\nThere are many optimizations in parsing as follows:\n- using SIMD to accelerate skipping white space.\n- using SIMD to find escaped chars when parsing strings.\n- using the STOA float pointing algorithm.\n\nSonic-cpp serializes a document to JSON. When serializing JSON strings, we should check the escaped characters first. So, we use SIMD instructions(AVX2/SSE) to find the escaped char for a long JSON string.\n\nSonic-cpp also supports ParseOnDemand if the user knows the target key at compile time. ParseOndemand also used SIMD and bit manipulation to skip the unwanted values fastly.\n\n## Usage\n### Include\nSonic-Cpp is a header-only library, you only need to include the directory of\nSonic-Cpp header files, such as adding `-I/path/to/sonic/include/` to your\ncompiler.\n\n### Parsing and Serializing\n```c++\n#include \"sonic/sonic.h\"\n\n#include \u003cstring\u003e\n#include \u003ciostream\u003e\n\nint main()\n{\n  std::string json = R\"(\n    {\n      \"a\": 1,\n      \"b\": 2\n    }\n  )\";\n\n  sonic_json::Document doc;\n  doc.Parse(json);\n\n  sonic_json::WriteBuffer wb;\n  doc.Serialize(wb);\n  std::cout \u003c\u003c wb.ToString() \u003c\u003c std::endl;\n}\n// g++ -I./include/ -march=haswell --std=c++11 -O3 example/parse_and_serialize.cpp -o example/parse_and_serialize\n```\n\n### Checking parse result\n```c++\n#include \"sonic/sonic.h\"\n\n#include \u003cstring\u003e\n#include \u003ciostream\u003e\n\nint main()\n{\n  std::string json = R\"(\n    {\n      \"a\": 1,\n      \"b\": 2\n    }\n  )\";\n\n  sonic_json::Document doc;\n  doc.Parse(json);\n  if (doc.HasParseError()) {\n    std::cout \u003c\u003c \"Parse failed!\\n\";\n  } else {\n    std::cout \u003c\u003c \"Parse successful!\\n\";\n  }\n  return 0;\n}\n// g++ -I./include/ -march=haswell --std=c++11 -O3 example/check_parse_result.cpp -o example/check_parse_result\n```\n\n#### Getting and Setting\n```c++\n#include \"sonic/sonic.h\"\n\n#include \u003cstring\u003e\n#include \u003ciostream\u003e\n\nusing member_itr_type = typename sonic_json::Document::MemberIterator;\n\nvoid print_member(member_itr_type m) {\n  const sonic_json::Node\u0026 key = m-\u003ename;\n  sonic_json::Node\u0026 value = m-\u003evalue;\n  if (key.IsString()) {\n    std::cout \u003c\u003c \"Key is: \"\n              \u003c\u003c key.GetString()\n              \u003c\u003c std::endl;\n  } else {\n    std::cout \u003c\u003c \"Incorrect key type!\\n\";\n    return;\n  }\n  if (value.IsInt64()) {\n    std::cout \u003c\u003c \"Value is \" \u003c\u003c value.GetInt64() \u003c\u003c std::endl;\n  }\n\n  return;\n}\n\nvoid set_new_value(member_itr_type m) {\n  sonic_json::Node\u0026 value = m-\u003evalue;\n  value.SetInt64(2);\n  return;\n}\n\nint main()\n{\n  std::string json = R\"(\n    {\n      \"a\": 1,\n      \"b\": 2\n    }\n  )\";\n\n  sonic_json::Document doc;\n  doc.Parse(json);\n\n  if (doc.HasParseError()) {\n    std::cout \u003c\u003c \"Parse failed!\\n\";\n    return -1;\n  }\n\n  // Find member by key\n  if (!doc.IsObject()) { // Check JSON value type.\n    std::cout \u003c\u003c \"Incorrect doc type!\\n\";\n    return -1;\n  }\n  auto m = doc.FindMember(\"a\");\n  if (m != doc.MemberEnd()) {\n    std::cout \u003c\u003c \"Before Setting new value:\\n\";\n    print_member(m);\n    std::cout \u003c\u003c \"After Setting value:\\n\";\n    set_new_value(m);\n    print_member(m);\n  } else {\n    std::cout \u003c\u003c \"Find key doesn't exist!\\n\";\n  }\n  return 0;\n}\n// g++ -I./include/ -march=haswell --std=c++11 -O3 example/get_and_set.cpp -o example/get_and_set\n```\nThe following Is\\*, Get\\* and Set\\* methods are supported:\n- IsNull(), SetNull()\n- IsBool(), GetBool(), SetBool(bool)\n- IsString(), GetString(), GetStringView(), SetString(const char*, size_t)\n- IsNumber()\n- IsArray(), SetArray()\n- IsObject(), SetObject()\n- IsTrue(), IsFalse()\n- IsDouble(), GetDouble(), SetDouble(double)\n- IsInt64(), GetInt64(), SetInt64(int64_t)\n- IsUint64(), GetUint64(), SetUint64_t(uint64_t)\n\n----\nMore [usage](docs/usage.md).\n\n## RoadMap\n* [ ] Support `RawNumber` for JSON parsing.\n* [ ] Support [`JSON Path`](https://datatracker.ietf.org/wg/jsonpath/about/).\n* [ ] Support [`JSON Merge Patch`](https://www.rfc-editor.org/rfc/rfc7396).\n* [ ] Support [`JSON Pointer`](https://datatracker.ietf.org/doc/html/rfc6901).\n* [ ] Support more platforms, e.g. ARM.\n* [ ] Support struct bind.\n* [ ] Support validating UTF-8.\n\n## Contributing\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for information on contributing to sonic-cpp.\n","funding_links":[],"categories":["JSON","HarmonyOS"],"sub_categories":["Windows Manager"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbytedance%2Fsonic-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbytedance%2Fsonic-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbytedance%2Fsonic-cpp/lists"}