You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:30:43