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_LIB_DIR=$SCONS_PATH/engine
解压编译Jsoncpp

将下载的 jsoncpp压缩包,进行解压:

tar -xvf jsoncpp-0.10.5.tar.gz
cd jsoncpp-src-0.10.5
python $SCONS_PATH/script/scons platform=linux-gcc

Jsoncpp顺序问题

字符串在输出的json文件中不是按着list添加顺序的,而是按照字母表排序的。jsoncpp库采用map关联容器存储节点数据,map的特点是插入和查找时采用了红黑树算法。
在网上找到了两个解决方式,一个是禁止insert调用"<"重载函数,一个是插入数据时,记录插入索引,输出数据时,按插入索引输出。
分别尝试后发现第一种方式影响的东西太多,并不理想。第二种方式按照提供的方法发现保存的索引总是丢失,测试后发现不可用。想要实现索引保存要修改的程序有点多。
虽然第二种方式没有成功,但给我提供了思路。研究jsoncpp的代码后发现,输出只有一处,且是依据一个string类型vector。
所以,首先在json_value.cpp添加一个string类型vector的全局变量。
在这里插入图片描述在json_value.cpp中搜索关键字:value_.map_->insert。有3个地方,修改其中两个resolveReference函数,修改如下:

// @param key is not null-terminated.
Value& Value::resolveReference(char const* key, char const* cend)
{
  JSON_ASSERT_MESSAGE(
      type_ == nullValue || type_ == objectValue,
      "in Json::Value::resolveReference(key, end): requires objectValue");
  if (type_ == nullValue)
    *this = Value(objectValue);
  CZString actualKey(
      key, static_cast<unsigned>(cend-key), CZString::duplicateOnCopy);
  ObjectValues::iterator it = value_.map_->lower_bound(actualKey);
  if (it != value_.map_->end() && (*it).first == actualKey)
    return (*it).second;
  ObjectValues::value_type defaultValue(actualKey, nullRef);
  it = value_.map_->insert(it, defaultValue);
  Value& value = (*it).second;
  
#if 1// 按顺序插入vector insertnums中
  insertnums.push_back(std::string((*it).first.data(),(*it).first.length()));
#endif

  return value;
}

第三个是插入多条数据,组成json数组用的,它的插入顺序不用修改。
最后,找到输出数据的地方:Value::Members Value::getMemberNames()。修改如下:

// An highlighted block
Value::Members Value::getMemberNames() const {
  JSON_ASSERT_MESSAGE(
      type_ == nullValue || type_ == objectValue,
      "in Json::Value::getMemberNames(), value must be objectValue");
  if (type_ == nullValue)
    return Value::Members();
  Members members;
  members.reserve(value_.map_->size());
  ObjectValues::const_iterator it = value_.map_->begin();
  ObjectValues::const_iterator itEnd = value_.map_->end();
  
#if 1 // 按插入顺序输出  
  unsigned int idx = 0;
  idx = 0;// 避免不使用时出现编译警告
#endif
	for (; it != itEnd; ++it){ 
#if 1 // 按插入顺序输出 

	members.push_back(insertnums[idx]);
	idx++;
	
#else	
    members.push_back(std::string((*it).first.data(),(*it).first.length()));
#endif	
  }
  return members;
}

目前编译运行后,结果正常,暂时没发现其它问题。是否有其它影响或遗漏等待后续测试。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值