遍历 json 对象过程中无法修改对象值

2018-10-15 11:05:02 +08:00
 BingoXuan

由于一直在写 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": ""
} */
		}
	}
}
2348 次点击
所在节点    C
5 条回复
wutiantong
2018-10-15 12:49:44 +08:00
我直接拿你的代码试了一下,没什么问题呀,你再表达一下你的意思?
wutiantong
2018-10-15 12:51:30 +08:00
哦,我知道你这个问题了。注意这行:
auto row = reply_json["result"];
你这个 row 不是引用,所以应该改成:
auto & row = reply_json["result"];
BingoXuan
2018-10-15 13:06:26 +08:00
@wutiantong
thanks,自己真的太菜了:'(
wutiantong
2018-10-15 13:12:40 +08:00
@BingoXuan 这类 mistake 可以通过减少不必要的临时变量创建来避免:
for (auto& row : reply["result"])
for (auto& col : row)
...
我是这样写的。
合理的运用链式调用也可以有效的避免创建临时变量。
arzterk
2018-10-15 14:41:27 +08:00
我以前搞过一个 C++的 json 序列化框架 https://github.com/Liudx1985/dxh/blob/master/json_serialize.hpp ,可以不用手写序列化

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497682

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX