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