#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. Большое вам спасибо!