Изменение значений JSON не имеет никакого эффекта с помощью повышения переполнения стека

Я пытаюсь изменить некоторые значения в моем файле json, но это не влияет на файл 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?

Любая помощь будет оценена.

Спасибо.

1

Решение

Да, вам нужно сохранить файл 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"}
]
}
1

Другие решения

Решение:

  • Парсер json Boost использует только строку в ptree, что означает, что для ptree нет ссылок на такие типы, как bool / int. ТОЛЬКО строка
  • Хотя я использовал не очень элегантное решение, такое как обычные манипуляции с файлами с использованием классов ifstream и ofstream, Вот Вы можете найти (прокрутите вниз до раздела C / C ++) все API-интерфейсы json, которые поддерживают типы.
1

По вопросам рекламы [email protected]