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;
}
目前编译运行后,结果正常,暂时没发现其它问题。是否有其它影响或遗漏等待后续测试。