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

jwm*_*jwm 4 c++ tostring jsoncpp

我有一个要序列化的jsoncpp值。最直接的方法是这样的:

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

std::string str = Json::FastWriter().write(val);
Run Code Online (Sandbox Code Playgroud)

问题是它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();
Run Code Online (Sandbox Code Playgroud)

这肯定不能“更好”吗?我假设错误在于我,并且有一种简单的方法来执行最小序列化(没有多余的空格)。

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

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

现在是正确的方法吗?

Lig*_*ica 5

你这样做是正确的。

第二个例子只是第一个例子的简写——在这两种情况下,构建器动态分配一个写入器,使用写入器,然后释放写入器。

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


Cal*_*eth 5

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

启动

Json::Value streamWriterSettings{R"({ "indentation" : "" })"};
Json::StreamWriterBuilder::setDefault(&streamWriterSettings);
Run Code Online (Sandbox Code Playgroud)

用法

std::string str = Json::writeString({}, val);
Run Code Online (Sandbox Code Playgroud)