如何在同一RapidJSON文档中设置不同的小数位

时间:2019-05-17 08:15:02

标签: formatting rapidjson

我已经使用通常的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()以这种方式应用于整个文档

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

1 个答案:

答案 0 :(得分:0)

我参加聚会太晚了,但是您可以创建一个具有不同写作设置的第二位作家:

StringBuffer buffer;

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

writer1.SetMaxDecimalPlaces(1);
writer2.SetMaxDecimalPlaces(2);

,然后使用特定的编写器直接将其写入缓冲区,而不是使用doc调用编写器:

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;
}