Как заменить jsoncpp FastWriter на Streambuilder? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть значение jsoncpp , которое я хочу сериализовать.Самый простой способ выглядит следующим образом:

Json::Value val; // population is left as an exercise for the reader

std::string str = Json::FastWriter().write(val);

Проблема в том, что FastWriter устарела, и я не могу терпеть предупреждения компилятора.Согласно менее интуитивной документации, я должен использовать StreamWriterBuilder вместо:

Json::StreamWriterBuilder builder;
builder["commentStyle"] = "None";
builder["indentation"] = "";
std::unique_ptr<Json::StreamWriter> writer( builder.newStreamWriter() );
std::ostringstream os;
writer->write(val, &os);
std::string str = os.str();

Конечно, это не может быть "лучше"?Я предполагаю, что ошибка лежит на мне, и есть простой способ выполнить минимальную сериализацию (без посторонних пробелов).

Этот показывает немного более компактную форму (хотя кажется, что простооберните вышеупомянутое в вызов функции).

Json::StreamWriterBuilder builder;
builder["indentation"] = "";  // assume default for comments is None
std::string str = Json::writeString(builder, val);

Это правильный путь сейчас?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Если вы всегда хотите писать с одними и теми же настройками (например, ["indentation"] = ""), вы можете указать Json::Value, представляющий настройки для Json::StreamWriterBuilder::setDefault, тогда для записи строк не нужно снова называть Json::StreamWriterBuilder (но по умолчанию создает один)

Запуск

Json::Value streamWriterSettings{R"({ "indentation" : "" })"};
Json::StreamWriterBuilder::setDefault(&streamWriterSettings);

Использование

std::string str = Json::writeString({}, val);
0 голосов
/ 02 января 2019

Вы делаете это правильно.

Второй пример - это просто сокращение для первого - в обоих случаях строитель динамически выделяет писателя, писатель используется, а затем писатель освобождается.

Почему устаревшая FastWriter реализация устарела, я не могу сказать.Лично я немного скучаю.Но фабрика более гибкая и позволяет использовать разные реализации в одном и том же наборе функций.Вам нужно будет спросить разработчиков JsonCpp, было ли это основой их решения.

...