【问题标题】:How to serialize RapidJSON document to a string?如何将 RapidJSON 文档序列化为字符串?
【发布时间】:2016-01-22 13:16:47
【问题描述】:

如何将 RapidJSON 文档序列化为字符串?
在所有示例中,序列化文本通过FileStream 重定向到标准输出,但我需要将其重定向到字符串变量。

【问题讨论】:

    标签: c++ string document rapidjson


    【解决方案1】:

    像这样:

    const char *GetJsonText()
    {
      rapidjson::StringBuffer buffer;
    
      buffer.Clear();
    
      rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
      doc.Accept(writer);
    
      return strdup( buffer.GetString() );
    }
    

    那么你必须在返回时调用 free(),或者这样做:

    return string( buffer.GetString() );
    

    改为。

    【讨论】:

    • 谢谢...但是“doc.Accept(writer);”这一行它返回“空”值。不明白是什么原因。??????当我执行“doc['x'].Accept(writer);”时它返回 x 的值。为什么是空值......? :(
    • 您必须发布一些示例代码,我不能仅凭猜测告诉您。
    • 我只是快速浏览了一下。接受返回一个布尔值。它不能返回 NULL。我认为 doc 是 rapidjson::Document 类型,用 doc.Parse(jsonDaten.c_str());. 初始化
    • 这也适用于嵌套的 rapidjson 文档吗?
    • 我有个问题,可能是个傻问题,buffer.GetString()的对象类型是什么
    【解决方案2】:

    first page of the project中,代码已经展示了如何将文档序列化为字符串(stringify a document):

    // 3. Stringify the DOM
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    d.Accept(writer);
    
    // Output {"project":"rapidjson","stars":11}
    std::cout << buffer.GetString() << std::endl;
    

    buffer.GetString() 这里返回一个const char* 类型的字符串。它还有一个buffer.GetSize() 用于返回输出字符串的大小。因此,如果您将其转换为std::string,最好的方法是:

    std::string s(buffer.GetString(), buffer.GetSize());
    

    除了 RapidJSON 的其他常见用法之外,tutorial.cpp 也显示相同的内容。

    【讨论】:

    • buffer 的析构函数会释放buffer.GetString() 吗?如果是,那么有没有办法移动buffer的内容而不是复制它?
    【解决方案3】:

    示例代码:

    Document document;
    const char *json = " { \"x\" : \"0.01\", \"y\" :\"0.02\" , \"z\" : \"0.03\"} ";
    
    document.Parse<0>(json);
    
    //convert document to string
    
    StringBuffer strbuf;
    strbuf.Clear();
    
    Writer<StringBuffer> writer(strbuf);
    document.Accept(writer);
    
    std::string ownShipRadarString = strbuf.GetString();
    std::cout << "**********************************************" << ownShipRadarString << std::endl;
    

    【讨论】:

      【解决方案4】:

      为避免复制字符串内容,您可以创建一个 rapidjson Stream-concept 类来包装现有的 std::string,参考:https://github.com/Tencent/rapidjson/issues/846#issuecomment-298088278

      事实上,并非所有实现的方法都是必需的。应该这样做:

      void writeDocumentToString(const rapidjson::Document& document,
                                 std::string& output)
      {
        class StringHolder
        {
        public:
          typedef char Ch;
          StringHolder(std::string& s) : s_(s) { s_.reserve(4096); }
          void Put(char c) { s_.push_back(c); }
          void Flush() { return; }
      
        private:
          std::string& s_;
        };
      
        StringHolder os(output);
        rapidjson::Writer<StringHolder> writer(os);
        document.Accept(writer);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 2022-11-15
        相关资源
        最近更新 更多