Запись в существующий файл json

#c #json #jsoncpp

#c #json #jsoncpp

Вопрос:

Я использую этот код для добавления в мой существующий файл JSON. Однако он полностью переопределяет мой файл JSON и просто помещает в него один объект JSON, когда я просто хотел бы добавить еще один элемент в список элементов в моем файле JSON. Как бы мне это исправить?

 Json::Value root;
    root[h]["userM"] = m;
    root[h]["userT"] = t;
    root[h]["userF"] = f;
    root[h]["userH"] = h;
    root[h]["userD"] = d;

    Json::StreamWriterBuilder builder;
    std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
    std::ofstream outputFileStream("messages.json");
    writer-> write(root, amp;outputFileStream);
  

Комментарии:

1. Какую библиотеку вы используете?

2. Да, jsoncpp я не могу найти другого способа сделать это, я ищу часами @drescherjm

3. Держу пари, что практически каждая существующая библиотека JSON поддерживает только переопределение файла, а не выполнение операций на месте. Операции на месте в структурированном файле просто не имеют особого смысла (другими словами: это физически невозможно). Есть ли причина, по которой вы не хотите читать файл JSON, редактировать структуру и записывать его обратно?

Ответ №1:

Моя рекомендация

  • Загрузите файл в Json::Value
  • Добавьте или измените любые поля, которые вы хотите
  • Перезаписать исходный файл обновленным Json::Value

Это будет наименее подверженный ошибкам метод, и он будет работать быстро, если у вас нет очень большого Json файла.

Как читать во всем файле

Это довольно просто! Мы создаем корень, затем просто используем >> оператор для чтения в файле.

 Json::Value readFile(std::istreamamp; file) {
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse( file, root );
    if(not parsingSuccessful) {
        // Handle error case
    }
    return root; 
}
  

Смотрите Эту документацию здесь для получения дополнительной информации

Комментарии:

1. Как загрузить файл в Json::Value, а затем добавить к нему, как вы говорите?