用 Streambuilder 替换 jsoncpp FastWriter 的方法是什么?

What is the way to replace jsoncpp FastWriter with Streambuilder?

我有一个要序列化的 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();

这不可能是"better"吧?我假设错误出在我身上,并且有一种直接的方法可以执行最小序列化(没有多余的空格)。

This 显示了一种稍微更紧凑的形式(尽管它似乎只是将上面的内容包装在一个函数调用中)。

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

现在这样对吗?

你做对了。

第二个示例只是第一个示例的 shorthand — 在这两个示例中,构建器动态分配写入器,使用写入器,然后释放写入器。

为什么 旧的 FastWriter 实现被弃用我不能说。我个人有点想念它。但是工厂更灵活,允许不同的实现插入同一组函数中。您必须询问 JsonCpp 开发人员,这是否是他们决定的核心。

如果你总是想用相同的设置写入(例如你的 ["indentation"] = ""),你可以提供一个 Json::Value 代表 Json::StreamWriterBuilder::setDefault 的设置,然后写入字符串不会需要再次命名 Json::StreamWriterBuilder(但默认构造一个)

启动

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

用法

std::string str = Json::writeString({}, val);