如何禁用nlohmann json键值对字母重排 保留键插入顺序
nlohmann json序列化时键自动按字母排序的解决方法
问题原因
nlohmann json默认的nlohmann::json类型底层采用std::map存储对象键值对,std::map是基于红黑树实现的有序关联容器,会自动按照键的字典序排序,因此最终序列化输出的键顺序和插入顺序不一致。
解决方案
优先使用库内置的nlohmann::ordered_json类型(nlohmann json v3.9.0及以上版本原生支持),该类型底层采用维护插入顺序的容器存储键值对,不会自动重排键顺序,原有业务代码几乎不需要改动,仅需替换类型声明即可:
// 将原有的nlohmann::json替换为nlohmann::ordered_json nlohmann::ordered_json payload = {{"type", "market"}, {"side", "buy"}, {"product_id",market}, {"funds", size}}; std::cout << payload.dump() << std::endl;
修改后序列化输出会严格遵循键的插入顺序:
{"type":"market","side":"buy","product_id":"BTC-USD","funds":"10"}
如果使用v3.9.0以下的旧版本,可通过自定义模板参数,指定支持插入序的容器(如vector封装的有序map)作为底层存储,但更推荐直接升级库版本使用内置实现,避免自定义特化引入兼容问题。
注意:JSON官方规范并未强制要求对象的键顺序,绝大多数JSON解析场景也不会依赖键的排列顺序。如果业务没有强依赖键的输出顺序,使用默认
nlohmann::json类型的存取性能更优。
内容的提问来源于stack exchange,提问作者dopller
相关产品推荐
相关产品推荐

