Как установить разные десятичные разряды в одном документе quickjson - PullRequest
0 голосов
/ 17 мая 2019

Я сделал быстрый документ со всеми моими объектами и значениями, используя обычный метод AddMember (). Теперь я хочу получить строку из этого документа для публикации в брокере 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 () применяется ко всему документу таким образом

Я хотел бы получить тот же вывод, первый пример кода, но с использованием документа, созданного из второго исходного кода. Как я могу сказать автору по-разному форматировать каждого члена?

...