不能。simdjson 要求输入为以 null 结尾、内存连续、已完全加载的 UTF-8 缓冲区且长度 ≥16 字节;流式解析需用 padded_string 或 document_stream;构造 padded_string 必须确保 64 字节 padding;ondemand value 是悬空引用,须在 document 有效期内访问;get_int64() 不支持隐式转换,需先判类型。

simdjson 能不能直接解析任意 JSON 字符串?
不能。simdjson 不是“带 SIMD 加速的通用 JSON 解析器”,它要求输入满足 on-demand 模式或 dom 模式下的严格前提:字符串必须是**以 null 结尾的、内存连续的、已完全加载的 UTF-8 缓冲区**,且长度需 ≥ 16 字节(否则 fallback 到 scalar 解析)。如果你从网络流式读取或边读边解析,simdjson::padded_string 或 simdjson::document_stream 是必须的中间封装,不能直接传裸指针。
如何正确构造 simdjson::padded_string?
这是最容易出错的一步:很多人直接用 std::string.data() 构造 simdjson::padded_string,但 std::string 不保证末尾有额外 64 字节 padding —— 而 simdjson 的 AVX2 / NEON 路径在 chunk 处理时会跨读最多 64 字节。错误做法会导致段错误或未定义行为。
- 推荐方式:用
simdjson::padded_string::load(…)从文件路径加载(自动 pad) - 内存中已有数据:用
simdjson::padded_string(json_data, json_length)—— 注意第二个参数是原始 JSON 长度,不是缓冲区总长;构造函数内部会分配并复制 + pad - 若已手动分配带 padding 的缓冲区(如
std::vector),可用(len + 64) simdjson::padded_string::borrow(…),但必须确保后续生命周期内该内存不被释放或修改
使用 ondemand API 解析嵌套对象时要注意什么?
simdjson::ondemand::document 是零拷贝、延迟解析的,但它的迭代器(如 object.find_field("key"))返回的是 simdjson::ondemand::value,它本身不持有数据,只保存解析上下文和偏移。一旦所属 document 被销毁或移动,再访问该 value 就是悬空引用。
simdjson::padded_string pstr = /* ... */;
simdjson::ondemand::parser parser;
auto doc = parser.iterate(pstr);
auto obj = doc.get_object(); // ok
auto val = obj.find_field("name"); // 返回 ondemand::value,但不 copy 数据
// ⚠️ 错误:下面这行可能 crash,因为 doc 已离开作用域
// std::string_view name = val.get_string();
// 正确:在 doc 有效期内完成所有 get_xxx() 调用
std::string_view name;
if (val.error() == simdjson::SUCCESS) {
name = val.get_string().value(); // .value() 提取实际 view
}
为什么 parse() 成功但 get_int64() 却报 INCORRECT_TYPE?
simdjson 的类型检查非常严格。即使 JSON 中写的是 "123"(字符串),调用 get_int64() 会失败,因为它不执行隐式类型转换。同样,true 不能当 int64_t 用,null 更不行。
立即学习“C++免费学习笔记(深入)”;
- 先用
value.type()查类型(返回simdjson::ondemand::json_type) - 对数字字段,优先尝试
get_int64()和get_double(),但要处理INCORRECT_TYPE和NUMBER_OUT_OF_RANGE - 如果业务允许宽松解析,得自己写适配逻辑,比如遇到 string 类型时用
std::from_chars手动转整数
另外注意:JSON 标准允许整数超出 int64_t 表达范围(如 2^64),此时 get_int64() 必然失败,必须用 get_double() 或自定义大数解析。











