由于一直在写 python,所以最近想做一门硬菜—— c++。但遇到一个问题
我在使用 nlohmann 的 json 库将字符串解析为 json 后,再取 result 字段的数据,遍历所有对象,并将字符串再次 parse 为 json。但 for 循环中可以修改值,但是到下一个循环就值就变为原值了。但按道理对引用的值进行修改,原本的变量也会跟着改变。似乎我的代码中,引用并非是原变量的引用。
现在的解决方案是,两次循环都先创建一个对象啊,并把修改结果扔进去,最后删掉 result 字段,加入新创建的对象。虽然能解决实际问题,但没有解决学习的问题。想问一下各位,到底哪里错了?
(╥﹏╥)代码写的很烂,辣到各位眼睛真的很抱歉。如果能展示一下优化代码,真的感激不尽~
{
"id": "638244d6efa24d1ca55caad38b3e3638",
"jsonrpc": "2.0",
"result": [
[
0,
0,
1
],
[
1,
"{'roc_function': 'hello', 'args': 'hello', 'kwargs': ''}",
],
]
}
auto row = reply_json["result"];
for ( auto &item : row )
{
for ( auto &col : item )
{
if ( col.is_string() )
{
/* 将字符串转化为 json */
string temp = col.dump();
string sub_temp = temp.substr( 1, temp.length() - 2 );
replace( sub_temp.begin(), sub_temp.end(), '\'', '\"' );
json temp_json = json::parse( sub_temp );
/* 重新赋值 */
col = temp_json;
/* 格式化输出 */
cout << col.dump(2) << endl;
/* {
"roc_function": "hello",
"args": "hello",
"kwargs": ""
} */
}
}
}
1
wutiantong 2018-10-15 12:49:44 +08:00 1
我直接拿你的代码试了一下,没什么问题呀,你再表达一下你的意思?
|
2
wutiantong 2018-10-15 12:51:30 +08:00 1
哦,我知道你这个问题了。注意这行:
auto row = reply_json["result"]; 你这个 row 不是引用,所以应该改成: auto & row = reply_json["result"]; |
3
BingoXuan OP @wutiantong
thanks,自己真的太菜了:'( |
4
wutiantong 2018-10-15 13:12:40 +08:00
@BingoXuan 这类 mistake 可以通过减少不必要的临时变量创建来避免:
for (auto& row : reply["result"]) for (auto& col : row) ... 我是这样写的。 合理的运用链式调用也可以有效的避免创建临时变量。 |
5
arzterk 2018-10-15 14:41:27 +08:00 1
我以前搞过一个 C++的 json 序列化框架 https://github.com/Liudx1985/dxh/blob/master/json_serialize.hpp ,可以不用手写序列化
|