jsoncpp输出顺序

jsoncpp解决序列化顺序按字母排序问题 使用场景:需要修改json中key的值,如果使用jsoncpp读取——序列化——修改值——存储,这样的话存的json文件的关键字的顺序就和源文件不是一致的,默认会按照字母进行排序。 使用jsoncpp没有找到合适的方式进行解决,只能借助python进行解决。 我们可以在c++中调用python的函数进行这个操作: ... 阅读详情

       最近在做一个NLU相关的项目,需要对json文件进行读取,wins vs2008环境,需要引入第三方库json.h,需要工程导入jsoncpp的静态数据连接库json_vc71_libmtd.lib,详细的教程可以自行百度。在输出的json文件我发现不是按着list添加顺序的,它是按照字母表给排序过的,  json内部存储object元素是用map存储的,map的特性就是会对每次insert入的<key,value>值,按照key排序,这就要求key的类型具有<号的重载(key的类型是class)。Json::Value内部存储对象类型是用map:<CZString, Value>,CZString 是Value内部定义的字符串类型,并对<小于号做了重载。

方法:禁止insert调用"<"重载函数

添加一下方法

class Value

{

……

public:
class JSON_API DisCmp {
    public:
        bool operator()(const CZString& s1, const CZString& s2) const {
            return true;   //不做任何处理,直接返回
        }
    };
//typedef std::map<CZString, Value> ObjectValues;   这个是原来的对象类型的声明函数
typedef std::map<CZString, Value, DisCmp> ObjectValues;   //这个是新的,用DisCmp禁用insert排序
……
}

       以上,就完成了禁用了往map中插入元素的排序功能的任务。但是这个时候问题其实还没解决,因为这个时候我输出的结果是按照我原来的插入顺序了,可是输出地值却仍然全是null。map内部存储数据是用红黑树算法的,那map::find()函数查找值的时候也是根据红黑树的模式进行查找的。而我禁用了insert元素时候的排序功能,就破坏了这种结构,这个时候还用find()查找的话,当然就找不到值了。把find函数改成遍历。

const Value &
Value::operator[]( const char *key ) const
{
   JSON_ASSERT(type_ == nullValue  ||  type_ == objectValue);
   if (type_ == nullValue) {
      return null;
   }
#ifndef JSON_VALUE_USE_INTERNAL_MAP
   CZString actualKey(key, CZString::noDuplication);
   //wangff----
   //ObjectValues::const_iterator it = value_.map_->find(actualKey);
   //由于map::find()函数是根据红黑树特性进行查找的,重写了map的insert比较方法之后,
   //便破坏了其内部的红黑树特性,因此,这里将find函数改成用遍历查找
   ObjectValues::const_iterator it;
   for (it=value_.map_->begin(); it!=value_.map_->end(); it++) {
       if (it->first == actualKey) {
           break;
       }
   }
    //----------------------
   if (it == value_.map_->end()) {
      return null;
   }
   return (*it).second;
#else
   const Value *value = value_.map_->find(key);
   return value ? *value : null;
#endif
}

 

C++ Jsoncpp 常用技巧 C++ Jsoncpp 常用技巧Json对象循环遍历Array数组循环遍历char*转JsonJson转string Json对象循环遍历 代码样式 int main() { Json::Value json_value = Json::Value(Json::objectValue); json_value["object_one"] = 1; json_value["o... 阅读详情

相关推荐

解决jsoncpp未按照添加顺序输出字符串的问题

添加元素时:: Json::Value root; root["name"] = Json::Value("hemenglin"); root["age"] = Json::Value("18"); // 将json转换为字符串 Json::StyledWriter sw; cout <<"delete end::" <<sw.write(root) << endl << endl; -------------------------------------------------------- (1) 输出的顺序为age,name;即按照key进行排序的;这是因为jsoncpp内部使用map进行存储key,默认是从小到大的顺序进行排序; (2)附件为修改好的,可以按照添加顺序进行输出的jsoncpp;有需要的同学可以下载

关于jsoncpp内部排序的问题

使用jsoncpp创建文件的时候,跟添加的顺序不相同,它是按照字母表给排序过的。 虽然问题没有解决,但是找到一篇很好的文章http://wff8785.blog.163.com/blog/static/8920227020109179151766/   json内部存储object元素是用map存储的,map的特性就是会对每次insert入的值,按照key排序,这就

sdcxyz的专栏 1万+

Json的两种排序方法

Json的两种排序方法,代码写的不规范请多多指点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

关于jsoncpp无序写入问题的解决

本文作者使用os << writer.write(root);创建json文件,采用root.getMemberNames()读取json标签,采用reader.parse(is, root)读取json文件。一文的详细阐述,该文章为目前博主搜索到的解决jsoncpp无序写入问题的唯一有效解法,其他文章所述方法对于最新的jsoncpp(1.9.5版本)无效。//-----------------------------------------------------------里的代码为新增部分。

qq_51651993的博客 1484

Rk3128投影仪救砖操作和固件分享思路

大家搞一条比较硬的东西,插入耳机口,就可以进入刷机模式了的,我的机器是这样的,大家也可以试试。(看不懂可以往下看)

MMX7088的博客 1万+

SAP 物料的分割评估

SAP 物料的分割评估 前言 本文主要讲解SAP中物料的分割评估,通过分割评估来区分出同一物料不同来源下的核算方式。例如:同一物料分为自产或者采购,或者同一物料分为进口或者国内采购等。 一、概述 分割评估一般用于以下场景: 1、物料分为内部采购和外部采购; 2、物料分属于进口或者国内采购; 3、物料分属于不同的批次; 4、物料分为自制或者采购。 由于物料的来源不同可能导致物料的价格或者性质不同,需要用不同价格来区分出 二、配置步骤 1.激活分割评估 ...

五谷散熊 6792

jsoncpp的输出顺序

 使用jsoncpp创建文件的时候,跟添加的顺序不相同,它是按照字母表给排序过的

多看多听多总结 6937

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

JsonCpp的小数精度问题和插入输出顺序问题

JsonCpp的小数精度问题和插入输出顺序问题 直接说吧,这两个问题无法解决,如下: 官方不支持指定小数位数,double默认位宽为17位,如:"value" : 7.0999999999999996, 官方不支持按插入顺序输出,而是按照key的字母排序输出的,不管你什么顺序插入,下面的都是这样的顺序输出的: "avg_abcdd " : 1.1632640000000014, "avg_pxczzczxczxd " : 7.0999999999999996,

AlwaySimple的博客 2467

共模电感在EMI滤波中的实战应用与设计技巧

本文深入探讨了共模电感在EMI滤波中的关键作用与设计技巧,涵盖电感值选择、饱和电流风险、磁芯材料性能及绕组工艺等实战经验。通过具体案例解析,展示了共模电感在开关电源、高速接口及汽车电子中的高效应用,帮助工程师解决电磁兼容问题并提升信号完整性。

weixin_27051161的博客 418

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5980

【免费下载】 解决jsoncpp未按照添加顺序输出字符串的问题:JSON序列化利器

在使用jsoncpp进行JSON处理时,开发者可能遇到一个常见问题:输出的JSON字符串顺序并非按照元素的添加顺序,而是根据键(key)的字典序排列。这个问题在某些场景下会导致不期望的结果,特别是在对JSON序列化顺序有特别要求的场景中。本项目提供了一个修改后的jsoncpp版本,解决了这一问题,使得开发者能够按照元素添加的顺序输出JSON字符串。 ## 项目技术分析 jsoncpp是一个C+...

gitblog_06726的博客 866

Transformers 实战修炼与源码剖析专栏大纲

本专栏以 Hugging Face Transformers 为主线,围绕“能用、会调、敢上线、懂源码”四个目标展开。内容不把理论堆成公式墙,而是用真实或拟真的业务场景驱动:客服分类、合同抽取、知识库问答、模型微调、推理服务、监控告警、源码扩展等。采用“业务痛点 → 三人剧本对话 → 代码实战 → 总结思考”的四段式结构,让读者在动手完成一个个小项目的过程中,逐步理解 Tokenizer、Model、Pipeline、Trainer、Generation、PEFT、Accelerate、Serving等概念

davidwang456的专栏 923

解决jsoncpp插入顺序以及无法序列化输出嵌套对象的问题

目前网上很多都是仅仅提供了按顺序输出字符的思路,但没有找到同时解决序列化嵌套对象的方法。我通过调试发现其无法序列化嵌套对象的原因,并且进行了修改测试,按照上述的处理,已经可以正常序列化了。json-1.9.7下载地址:https://github.com/open-source-parsers/jsoncpp。

qq_27281753的博客 519

一文就够-InfiniBand 技术全面解析:从原理到实践的通俗易懂指南

想象一下,在一个超级数据中心里,成千上万台服务器需要像蜜蜂群体一样高效协作。如果用传统的网络连接,就像让每只蜜蜂都排着队传递消息,效率极低。InfiniBand(简称 IB)就是为了解决这种 "通信拥堵" 而生的高速网络技术,它专门为高性能计算(HPC)、数据中心和云计算环境设计,就像给服务器之间搭建了多条高速公路,让数据可以飞驰而过。

jundao1997的专栏 1395

保研考研机试攻略(满分篇):第二章——满分之路上(1)

保研考研机试攻略(满分篇):第二章——满分之路上(1)2.1计算机和基础+2.2进阶背包问题+2.3毛毛虫算法

qq_63349644的博客 1195

Jsoncpp编译及插入顺序问题

Jsoncpp编译 Jsoncpp下载:https://github.com/open-source-parsers/jsoncpp/releases?after=1.8.2 jsoncpp-0.10.5.tar.gz Scons下载:scons-2.2.0.tar.gz 解压并配置SCons 将下载的 Scons压缩包,进行解压: tar -xvf scons-2.2.0.tar.gz 配置环境变量: export SCONS_PATH=****** /scons-2.2.0 export SCONS_L

qq_38205346的博客 2516

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

goahead处理json_jsoncpp按插入顺序排序和支持指定小数位数

jsoncpp是一个优秀的开源C++ json库,被广泛应用。在寻找C/C++ JSON库时,没有选择CJSON,而是选择了jsoncpp,主要考虑我应用程序是C++编写,如果使用CJSON的话,可能需要重新封装一层。就我的应用而言,jsoncpp和CJSON都有一个共同问题:官方代码不支持指定小数位数。jsoncpp还有另一个问题:它默认按字母排序输出json。一、按插入顺序输出json我的应...

weixin_32924159的博客 861

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【003:jsoncpp的简单使用】

1 #include <json/json.h> 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 int main(){ 7 Json::Value root; 8 Json::FastWriter writer; 9...

weixin_30807779的博客 77

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

用 jsonCpp 序列化、反序列化 json 字符串

原文链接: 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用, 而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择 JSON 的全称为:JavaScript Object Notation ,顾名思义, JSON 是用于标记 javascript 对象的,详情参考 http://www.json.org/。 本文选择第三方库 JsonCpp 来解析 json, J

u011513212 1万+

【Jsoncpp】manipulating JSON data in C++

JSON 是无序的,解析后的顺序可能与文件中的顺序不一致。如果需要保持顺序,可以使用有序的 JSON 库或手动指定顺序。嵌套对象的处理需要递归遍历,否则会拆开输出。

cxyhjl的博客 906

JsonCpp的基本用法

1、JsonCpp C++库,允许操作JSON值,包括与字符串串行化和序列化。它可在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的便捷方式。是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。 JsonCpp(1.8.4版本):htt...

king_weng的博客 4万+

JSONCPP安装及学习使用

文章目录jsoncpp简述jsoncpp安装及使用安装测试使用jsoncpp库的使用demo 学习用到jsoncpp这个库,首先要知道什么是json,它以怎样的形式存在。 JSON是一种轻量级的数据交换格式,它的语法规则如下 由 “键”:值 组成 --> 如 “name”: Bob 其中的值可以是双引号包起来的字符串、数、布尔类型、null、对象或者数组 上面所说的大家都很熟悉,只有最后两个是比较特殊的 对象:一个对象由花括号{}包起来,每一个键:值之间用逗号, 隔开,如 {“name”: An

再努力一点点就好了 4308

json库——jsoncpp

Notation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。

qq_43441284的博客 1万+

cJSON与Jsoncpp区别

先简述一下,后面详细更新: 在写数据时,jsoncpp内部会按照mapbiao'de

八至的博客 2234
上一篇: C++11 std::thread 多线程框架
下一篇: 深度优先搜索(DFS)---LeetCode47(全排列II)
breakpoints_
博客等级 码龄9年 52粉丝 28原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值