C++ 使用boost C+;更改json值没有任何效果+;

C++ 使用boost C+;更改json值没有任何效果+;,c++,json,boost,edit,savechanges,C++,Json,Boost,Edit,Savechanges,我试图更改json文件中的一些值,但它在json文件中没有任何效果,即使它打印了我在下面所做的更改 json文件: json文件是有效的,我只是写了相关的东西 增压代码: 问题是: json文件中没有任何更改,即使它通过framePair2.second.put(“可见”、“假”)打印成功的更改

我试图更改json文件中的一些值,但它在json文件中没有任何效果,即使它打印了我在下面所做的更改

json文件: json文件是有效的,我只是写了相关的东西

增压代码: 问题是: json文件中没有任何更改,即使它通过
framePair2.second.put(“可见”、“假”)打印成功的更改
怎么会在我使用put方法之后打印
false
,而在json文件中仍然是
true
?我需要保存json文件吗?如果是,使用boost的命令是什么

任何帮助都将不胜感激


谢谢。

是的,您需要保存JSON文件

这个没有“命令”。相反,使用函数就像使用函数(
read_json
)读取它一样:

更新

下面是一个示例(从字符串读取,写入std::cout)。我修复了处理没有
“id”
属性的数组元素时出现的错误

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <sstream>

using namespace boost::property_tree;

std::string const sample = R"(
    {
        "schemaVersion": 1,
            "array": [{
            },
            {
                "id": "stackoverflow",
                "visible": true
            }]
    }
)";

int main() {

    ptree doc;
    std::istringstream iss(sample);
    read_json(iss, doc);

    BOOST_FOREACH(ptree::value_type & framePair2, doc.get_child("array")) {
        auto id = framePair2.second.get_optional<std::string>("id");
        if (id && !id->compare("stackoverflow")) {
            std::cout << framePair2.second.get<std::string>("id")      << std::endl;
            std::cout << framePair2.second.get<std::string>("visible") << std::endl;
            framePair2.second.put<std::string>("visible", "false");
            std::cout  << framePair2.second.get<std::string>("visible") << std::endl;
        }
    }

    write_json(std::cout, doc);
}
解决方案:
  • Boost的json解析器只在ptree中使用字符串,这意味着ptree没有对bool/int.only字符串等类型的引用
  • 尽管我使用了不太优雅的解决方案,例如使用ifstream和ofstream类进行常规文件操作,但您可以找到(向下滚动到C/C++部分)所有支持类型的json API

嘿,sehe,所以我只需要写:boost::property\u tree::read\u json(test,doc);(再次…)我完成了吗?不。你应该阅读链接文档。它几乎是一样的,但不是函数名:)是的,计算机将要求您告诉它应该做什么。这不是“再次……”。那是准确的。原因是你的假设对你来说是有意义的,但不是对每个人都有意义(想象一下从网络套接字读取。你如何“神奇地”将任何更改保存回原始源?@OhadM如果你想要JSON,也许你应该改用JSON解析器。。。有好的JSON库around@OhadM你应该用你喜欢的。在工作中,我使用了您刚才看到的解析器(改进版)。主要是在自动序列化代码中(因此用户友好性不是目标)。事实是,Boost属性树不是一个XML/JSON/任何库。它是一个PropertyTree库(不管那是什么,我承认我认为Boost PropertyTree不需要在Boost中。它的适用性似乎很低)JSON不是一个文件(它是一种数据表示)。属性树不是JSON(它是表示层次数据的本地C++数据结构)。这些差异对于最终用户来说是微妙的,但对于程序员来说却是至关重要的,因为它们允许我们独立于实现来处理抽象概念。当您设置一个值时,您不关心JSON是最终出现在内存映射文件中,还是作为REST完整登录请求的SharedKeySignature被消化。
boost::property_tree::ptree doc;
string test = dir_path.string();
boost::property_tree::read_json(test, doc);

BOOST_FOREACH(boost::property_tree::ptree::value_type& framePair2, doc.get_child("array")){
   if (!framePair2.second.get<std::string>("id").compare("stackoverflow")){
        cout << framePair2.second.get<std::string>("id") << endl;
        cout << framePair2.second.get<std::string>("visible") << endl;
        framePair2.second.put<string>("visible", "false");
        cout << framePair2.second.get<std::string>("visible") << endl;
   }
stackoverflow //which is fine
true          //which is also fine
false         //which is exactly what I changed and need
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <sstream>

using namespace boost::property_tree;

std::string const sample = R"(
    {
        "schemaVersion": 1,
            "array": [{
            },
            {
                "id": "stackoverflow",
                "visible": true
            }]
    }
)";

int main() {

    ptree doc;
    std::istringstream iss(sample);
    read_json(iss, doc);

    BOOST_FOREACH(ptree::value_type & framePair2, doc.get_child("array")) {
        auto id = framePair2.second.get_optional<std::string>("id");
        if (id && !id->compare("stackoverflow")) {
            std::cout << framePair2.second.get<std::string>("id")      << std::endl;
            std::cout << framePair2.second.get<std::string>("visible") << std::endl;
            framePair2.second.put<std::string>("visible", "false");
            std::cout  << framePair2.second.get<std::string>("visible") << std::endl;
        }
    }

    write_json(std::cout, doc);
}
stackoverflow
true
false
{
    "schemaVersion": "1",
    "array": [
        "",
        {
            "id": "stackoverflow",
            "visible": "false"
        }
    ]
}