neujson

基于 C++17 的 JSON 解析/生成器

快速开始 GitHub 在新窗口打开

简单、快速

neujson 只包含头文件,不依赖 Boost 库,并充分利用模版的特性,你可以随意的 "组装" neujson 的 Handler。

简洁的 API

neujson 同时支持 DOM 和 SAX 风格的 API,SAX 可以自定义 Handler 实现流式处理。

Unicode 友好

neujson 充分支持 UTF-8 的编解码,可以解析 '\u0000' 这些 UTF-8 字符

多种输入输出流

neujson 内置了字符串输入输出流和文件输入输出流,并充分利用内存缓冲区来提高读写速度

内置 std 流包装类

neujson 提供了正式的 std::istream 和 std::ostream 包装类,可以与 neujson 的内置输入输出流组合

高性能

neujson 内部实现了 IEEE754 等标准,并使用了不同编译器内置的高性能算法。同时 neujson 计划实现 Grisu2 算法和借助 SIMD 指令以加快浮点数和字符串之间的转换。

用法一目了然

此简单例子解析一个 JSON 字符串至一个 document (DOM),对 DOM 作出简单修改,最终把 DOM 转换(stringify)至 JSON 字符串。

#include <cstdio>

#include "neujson/document.h"
#include "neujson/writer.h"
#include "neujson/string_write_stream.h"
#include "../sample.h"

int main() {
  // 1. Parse a JSON string into DOM.
  neujson::Document doc;
  auto err = doc.parse(kSample[0]);
  if (err != neujson::error::PARSE_OK) {
    puts(neujson::parseErrorStr(err));
    return EXIT_FAILURE;
  }

  // 2. Modify it by DOM.
  auto &s = doc[0]["Longitude"];
  s.SetDouble(s.GetDouble() + 100.0);

  // 3. Stringify the DOM
  neujson::StringWriteStream os;
  neujson::Writer<neujson::StringWriteStream> writer(os);
  doc.WriteTo(writer);

  // Output
  fprintf(stdout, "%.*s", static_cast<int>(os.get().length()), os.get().data());
  return 0;
}

输出:

[{"precision":"zip","Latitude":37.766800000000003,"Longitude":-22.395899999999997,"Address":"","City":"SAN FRANCISCO","State":"CA","Zip":"94107","Country":"US"},{"precision":"zip","Latitude":37.371991000000001,"Longitude":-122.02602,"Address":"","City":"SUNNYVALE","State":"CA","Zip":"94085","Country":"US"}]