Быстрый json, c , json, изменение пустого массива json

#json #rapidjson

#json #рапидджсон

Вопрос:

У меня есть json-файл, который содержит два объекта. Первый объект — это массив объектов. Каждый из этих объектов имеет элемент «ключ» и пустой массив. Мне нужно заполнить массив 4 числами, и мне нужно сохранить обратно json. Я проверяю учебник, но, вероятно, я что-то упускаю. Может кто-нибудь мне помочь, пожалуйста? Вот мой код, который не работает:

 void BimObjectsToProjection::modifyViewBoxForProjection(std::string projectionName, long long minX, long long minY, long long Xlen, long long Ylen)
{
    Valueamp; projections = md_FilesJsonDocument["ProjectionImages"];
    for (Value::ValueIterator projectionsIterator = projections.Begin(); projectionsIterator != projections.End();   projectionsIterator)
    {
        rapidjson::Valueamp; projectionJson = *projectionsIterator;
        string name = projectionJson["Name"].GetString();
        if (projectionName == name)
        {
            Document::AllocatorTypeamp; allocator = md_FilesJsonDocument.GetAllocator();
            rapidjson::Valueamp; viewBox = (*projectionsIterator)["BB"];

            viewBox.PushBack((int)minX, allocator);
            viewBox.PushBack((int)minY, allocator);
            viewBox.PushBack((int)Xlen, allocator);
            viewBox.PushBack((int)Ylen, allocator);
           
            rapidjson::StringBuffer strbuf;
            rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
            md_FilesJsonDocument.Accept(writer);
            break;
        }
    }
}
 

Json выглядит следующим образом:

 {
    "ProjectionImages": [
        {
            "Id": "33c75d31-7ccd-4daf-814a-56250cdee42f",
            "Name": "Projection_Image_Architectural_First Floor_Zone 1.png",
            "Discipline": "Architectural",
            "LevelName": "First Floor",
            "BB": [],
            "SheetFileName": null,
            "ProjectionLineFileId": "36bb6683-c6d3-43c2-bbdc-aedf3203ea86",
            "ProjectionLineFileName": "Projection_Image_Architectural_First Floor_Zone 1.pdf",
            "ZoneName": "Zone 1"
        },
...
 

Даже если я попытаюсь добавить новый элемент массива, этот код не сработает. Это из-за моего писательского подхода?

 void BimObjectsToProjection::modifyViewBoxForProjection(std::string projectionName, long long minX, long long minY, long long Xlen, long long Ylen)
{
    Valueamp; projections = md_FilesJsonDocument["ProjectionImages"];
    for (Value::ValueIterator projectionsIterator = projections.Begin(); projectionsIterator != projections.End();   projectionsIterator)
    {
        rapidjson::Valueamp; projectionJson = *projectionsIterator;
        string name = projectionJson["Name"].GetString();
        if (projectionName == name)
        {
            Document::AllocatorTypeamp; allocator = md_FilesJsonDocument.GetAllocator();
           
            Value a(kArrayType);
            a.PushBack((int)minX, allocator);
            a.PushBack((int)minY, allocator);
            a.PushBack((int)Xlen, allocator);
            a.PushBack((int)Ylen, allocator);
            (*projectionsIterator).AddMember("AA", a, allocator);
                  
            rapidjson::StringBuffer strbuf;
            rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
            md_FilesJsonDocument.Accept(writer);
            break;
        }
    }
}
 

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

1. Можете ли вы опубликовать json?

2. Я опубликовал это выше.

3. Я протестировал его, и он сработал. Как вы сериализуете json?

Ответ №1:

Эта часть кода ничего не делает:

 rapidjson::StringBuffer strbuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
md_FilesJsonDocument.Accept(writer);
 

strbuf содержит строку json, но она отбрасывается. Я бы перенес это в отдельную функцию и распечатал содержимое std::cout << strbuf; .

Для записи непосредственно в файл:

 std::ofstream ofs("out.json", std::ios::out);
if (ofs.is_open()) {
    rapidjson::OStreamWrapper osw(ofs);
    rapidjson::Writer<rapidjson::OStreamWrapper> writer(osw);
    md_FilesJsonDocument.Accept(writer);
}
 

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

1. Большое вам спасибо!