【问题标题】:How to set different decimal places in same rapidjson document如何在同一个rapidjson文档中设置不同的小数位
【发布时间】:2019-05-17 08:15:01
【问题描述】:

我使用常用​​的 AddMember() 方法制作了一个包含所有对象和值的 rapidjson 文档。现在我想从该文档中获取字符串以发布到 mqtt 代理。但是在该字符串中,一些成员应该有 2 个小数位,一些只有一个,而其他的都是小数。 在文档完全构建后,我找不到如何为特定成员设置小数位。

我通过编写器构建我的 json 文档成功地做到了这一点,但这不是我想要做的,因为该文档不能轻易修改:

#include <string>
#include <iostream>
#include <sstream>
#include <rapidjson/document.h>     // rapidjson's DOM-style API
#include <rapidjson/prettywriter.h> // for stringify JSON
#include <rapidjson/stringbuffer.h>

using namespace rapidjson;
using namespace std;

int main (int argc, char* argv[])
{
    Document doc;
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    writer.StartObject();
    writer.Key("member1");
    writer.SetMaxDecimalPlaces(2);
    writer.Double(1.0000001);
    writer.Key("member2");
    writer.SetMaxDecimalPlaces(3);
    writer.Double(3.123456);
    writer.Key("member3");
    writer.SetMaxDecimalPlaces(8);
    writer.Double(2.123456);
    writer.EndObject();
    cout << buffer.GetString() << endl;
    return 0;
}
./decimal
{"member1":1.0,"member2":3.123,"member3":2.123456}

现在,这就是我构建文档的方式:

#include <string>
#include <iostream>
#include <sstream>
#include <rapidjson/document.h>     // rapidjson's DOM-style API
#include <rapidjson/prettywriter.h> // for stringify JSON
#include <rapidjson/stringbuffer.h>

using namespace rapidjson;
using namespace std;

int main (int argc, char* argv[])
{
    Document doc;
    Document::AllocatorType& allocator = doc.GetAllocator();
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    doc.SetObject();
    doc.AddMember("member1", 1.0000001, allocator);
    doc.AddMember("member3", 3.123456, allocator);
    doc.AddMember("member2", 2.123456, allocator);
    writer.SetMaxDecimalPlaces(2);
    doc.Accept(writer);

    cout << buffer.GetString() << endl;
    return 0;
}
./decimal
{"member1":1.0,"member2":2.12,"member3":3.12}

SetMaxDecimalPlaces() 以这种方式应用于整个文档

我想获得与第一个代码示例相同的输出,但使用由第二个源代码制作的文档。我如何告诉作者以不同的方式格式化每个成员?

【问题讨论】:

    标签: formatting rapidjson


    【解决方案1】:

    我迟到了,但你可以创建一个具有不同写作设置的第二个作家:

    StringBuffer buffer;
    
    Writer<StringBuffer> writer1(buffer); // original writer
    Writer<StringBuffer> writer2(buffer); // a new second writer
    
    writer1.SetMaxDecimalPlaces(1);
    writer2.SetMaxDecimalPlaces(2);
    

    然后使用特定的writers直接写入buffer,而不是使用doc调用writer:

    writer.Key("member1");
    writer.Double(1.0);
    
    writer2.Key("member2");
    writer2.Double(2.12);
    
    writer2.Key("member3");
    writer2.Double(3.12);
    

    完整示例:

    using namespace rapidjson;
    using namespace std;
    
    int main (int argc, char* argv[])
    {
        StringBuffer buffer;
    
        Writer<StringBuffer> writer1(buffer);
        Writer<StringBuffer> writer2(buffer);
    
        writer1.SetMaxDecimalPlaces(2);
        writer2.SetMaxDecimalPlaces(2);
    
        writer1.StartObject();
    
        writer1.Key("member1");
        writer1.Double(1.0);
    
        writer2.Key("member2");
        writer2.Double(2.12);
    
        writer2.Key("member3");
        writer2.Double(3.12);
    
        writer1.EndObject();
    
        cout << buffer.GetString() << endl;
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 2012-03-19
      • 2015-09-08
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      相关资源
      最近更新 更多