修改boost::json::object值时编译报错,如何调用非const as_string()?
Boost.JSON嵌套对象值修改失败问题解决
问题描述
尝试使用boost::json::object存储包含多值的JSON对象并按需修改值,但始终无法完成修改。参照Boost.JSON文档编写的测试代码可正常读取值,但修改时触发编译错误。
测试代码
#include <iostream> #include <boost/json/src.hpp> #include <boost/json/object.hpp> using std::cout; using std::endl; int main(int argc, char* argv[]) { boost::json::object testobj; testobj["properties"] = { { "timestamp", "Fri Jan 6 02:17:29 PM EST 2023"}, { "textDescription", "This is a Description"} }; const boost::json::string& s = testobj.at("properties").at("textDescription").as_string(); cout << s << endl; testobj.at("properties").at("textDescription").as_string() = "Hello, World!"; // ERROR boost::json::string t = testobj.at("properties").at("textDescription").as_string(); cout << t << endl; return 0; }
编译错误信息
error: passing ‘const boost::json::string’ as ‘this’ argument discards qualifiers [-fpermissive] testobj.at("properties").at("textDescription").as_string() = "Hello, World!"; ^~~~~~~~~~~~~~~
问题分析
错误根源在于:testobj.at("properties")返回的是boost::json::value&(存储的是object类型),直接调用at("textDescription")时,编译器可能将上下文隐式转为const,导致后续as_string()调用的是const重载,返回不可修改的const boost::json::string&,无法完成赋值。
解决方案
提供两种可靠的修改方式:
方案1:显式转换为非const object引用
先将上层的value转换为boost::json::object&,确保后续访问子成员时处于非const上下文:
// 替换原ERROR行代码 testobj.at("properties").as_object().at("textDescription").as_string() = "Hello, World!";
as_object()返回非const的object&,后续at()调用返回value&,此时as_string()会调用非const重载,返回可修改的string&。
方案2:直接赋值给目标value
无需调用as_string(),直接将字符串字面量赋值给目标value,Boost.JSON会自动处理类型转换:
// 替换原ERROR行代码 testobj["properties"].as_object()["textDescription"] = "Hello, World!";
这种方式更简洁,避免了显式类型转换的繁琐。
修改后验证代码
#include <iostream> #include <boost/json/src.hpp> #include <boost/json/object.hpp> using std::cout; using std::endl; int main(int argc, char* argv[]) { boost::json::object testobj; testobj["properties"] = { { "timestamp", "Fri Jan 6 02:17:29 PM EST 2023"}, { "textDescription", "This is a Description"} }; const boost::json::string& s = testobj.at("properties").at("textDescription").as_string(); cout << s << endl; // 使用方案1修改 testobj.at("properties").as_object().at("textDescription").as_string() = "Hello, World!"; // 或使用方案2修改 // testobj["properties"].as_object()["textDescription"] = "Hello, World!"; boost::json::string t = testobj.at("properties").at("textDescription").as_string(); cout << t << endl; return 0; }
运行后输出:
This is a Description Hello, World!
内容的提问来源于stack exchange,提问作者David Yockey
相关产品推荐
相关产品推荐

