Я пытаюсь изменить некоторые значения в моем файле json, но это не влияет на файл json, даже если он печатает изменения, которые я сделал ниже.
{
"schemaVersion":1,
"array":[
{ //values...
},
{ //the relevant values..
"id":"stackoverflow",
"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("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
В файле json нет изменений четное хотя он печатает изменение успеха через framePair2.second.put<string>("visible", "false");
и я не понимаю почему.
Как это может быть, что он печатает 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);
}
Выход:
stackoverflow
true
false
{
"schemaVersion": "1",
"array": [
"",
{
"id": "stackoverflow",
"visible": "false"}
]
}