【问题标题】:What is the way to replace jsoncpp FastWriter with Streambuilder?用Streambuilder替换jsoncpp FastWriter的方法是什么?
【发布时间】:2018-12-13 23:47:35
【问题描述】:

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

这肯定不能“更好”吗?我假设问题出在我身上,并且有一种直接的方法来执行最小的序列化(没有多余的空格)。

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

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

现在这样是对的吗?

【问题讨论】:

    标签: c++ tostring jsoncpp


    【解决方案1】:

    你做对了。

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

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

    【讨论】:

      【解决方案2】:

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

      启动

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

      用法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多