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

问题描述 投票:0回答:1

我已经使用通常的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个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.