使用 boost C++ 更改 json 值无效
Changing json values has no effect using boost C++
我正在尝试更改我的 json 文件中的一些值,但它对 json 文件没有任何影响,即使它打印了我在下面所做的更改。
json 文件:
{
"schemaVersion":1,
"array":[
{ //values...
},
{ //the relevant values..
"id":"Whosebug",
"visible":true,
}
]
}
json文件有效我刚刚写了相关的东西
提升代码:
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("Whosebug")){
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;
}
输出:
Whosebug //which is fine
true //which is also fine
false //which is exactly what I changed and need
问题:
json 文件 even 中没有任何更改,尽管它通过 framePair2.second.put<string>("visible", "false");
打印成功更改,但我不明白为什么。
它怎么会打印 false
after 我使用 put 方法并在 json文件仍然是 true
?我需要保存 json 文件吗?如果是这样,使用 boost 的命令是什么?
如有任何帮助,我们将不胜感激。
谢谢。
是的,您需要保存 JSON 文件。
这里没有 "command"。而是使用 函数 就像您使用一个 (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": "Whosebug",
"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("Whosebug")) {
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);
}
输出:
Whosebug
true
false
{
"schemaVersion": "1",
"array": [
"",
{
"id": "Whosebug",
"visible": "false"
}
]
}
解决方案:
- Boost 的 json 解析器仅使用 ptree 中的字符串,这意味着 ptree 没有对 bool/int 等类型的引用。只有字符串。
- 虽然我使用了不太优雅的解决方案,例如使用 ifstream 和 ofstream 类 的普通文件操作,here 你可以找到(向下滚动到 C/C++ 部分)所有json API 支持类型。
我正在尝试更改我的 json 文件中的一些值,但它对 json 文件没有任何影响,即使它打印了我在下面所做的更改。
json 文件:
{
"schemaVersion":1,
"array":[
{ //values...
},
{ //the relevant values..
"id":"Whosebug",
"visible":true,
}
]
}
json文件有效我刚刚写了相关的东西
提升代码:
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("Whosebug")){
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;
}
输出:
Whosebug //which is fine
true //which is also fine
false //which is exactly what I changed and need
问题:
json 文件 even 中没有任何更改,尽管它通过 framePair2.second.put<string>("visible", "false");
打印成功更改,但我不明白为什么。
它怎么会打印 false
after 我使用 put 方法并在 json文件仍然是 true
?我需要保存 json 文件吗?如果是这样,使用 boost 的命令是什么?
如有任何帮助,我们将不胜感激。
谢谢。
是的,您需要保存 JSON 文件。
这里没有 "command"。而是使用 函数 就像您使用一个 (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": "Whosebug",
"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("Whosebug")) {
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);
}
输出:
Whosebug
true
false
{
"schemaVersion": "1",
"array": [
"",
{
"id": "Whosebug",
"visible": "false"
}
]
}
解决方案:
- Boost 的 json 解析器仅使用 ptree 中的字符串,这意味着 ptree 没有对 bool/int 等类型的引用。只有字符串。
- 虽然我使用了不太优雅的解决方案,例如使用 ifstream 和 ofstream 类 的普通文件操作,here 你可以找到(向下滚动到 C/C++ 部分)所有json API 支持类型。