V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BingoXuan
V2EX  ›  C

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

  •  
  •   BingoXuan · 2018-10-15 11:05:02 +08:00 · 2427 次点击
    这是一个创建于 2232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于一直在写 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": ""
    } */
    		}
    	}
    }
    
    5 条回复    2018-10-15 14:41:27 +08:00
    wutiantong
        1
    wutiantong  
       2018-10-15 12:49:44 +08:00   ❤️ 1
    我直接拿你的代码试了一下,没什么问题呀,你再表达一下你的意思?
    wutiantong
        2
    wutiantong  
       2018-10-15 12:51:30 +08:00   ❤️ 1
    哦,我知道你这个问题了。注意这行:
    auto row = reply_json["result"];
    你这个 row 不是引用,所以应该改成:
    auto & row = reply_json["result"];
    BingoXuan
        3
    BingoXuan  
    OP
       2018-10-15 13:06:26 +08:00 via Android
    @wutiantong
    thanks,自己真的太菜了:'(
    wutiantong
        4
    wutiantong  
       2018-10-15 13:12:40 +08:00
    @BingoXuan 这类 mistake 可以通过减少不必要的临时变量创建来避免:
    for (auto& row : reply["result"])
    for (auto& col : row)
    ...
    我是这样写的。
    合理的运用链式调用也可以有效的避免创建临时变量。
    arzterk
        5
    arzterk  
       2018-10-15 14:41:27 +08:00   ❤️ 1
    我以前搞过一个 C++的 json 序列化框架 https://github.com/Liudx1985/dxh/blob/master/json_serialize.hpp ,可以不用手写序列化
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2919 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.