neujson
基于 C++17 的 JSON 解析/生成器
简单、快速
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"}]