Получение необработанной строки (или байтов) для двойного значения при разборе rapidjson?

Есть ли способ получить базовые байты для двойного значения при разборе json с использованием rapidjson.

Посмотрите на код ниже:

string temp_json2 = "{\"byte_size\":1000.3}";
rapidjson::Document doc;
doc.Parse<0>(temp_json2.c_str());

rapidjson::Value::ConstMemberIterator iter = doc.MemberBegin();

const rapidjson::Value& key = iter->name;
std::cout << key.GetString() << " = "; 

const rapidjson::Value& val = iter->value;
std::cout << val.GetDouble();

Я хочу получить что-то вроде

val.GetRawString(); вместо val.GetDouble();

Причина, по которой мне это нужно, заключается в том, что я не хочу терять точность во время преобразования. Обратите внимание, что у меня нет возможности изменить json, чтобы поставить кавычки вокруг двойного значения.


person Muhammad Ikramul Haq    schedule 14.11.2014    source источник
comment
Вы нашли решение для этого? У нас такая же проблема.   -  person bpeikes    schedule 20.05.2016


Ответы (2)


В настоящее время нет.

Я работаю над опцией синтаксического анализа «полной точности» (в течение довольно долгого времени), которая может точно анализировать строку в double. Преобразование double в строку уже является точным с использованием алгоритма grisu2. Но если строка не может быть точно представлена ​​double, она все равно потеряет некоторую точность.

Для поддержки вашего требования может потребоваться добавить параметр синтаксического анализа и изменить интерфейс SAX и DOM. Если вы хотите, чтобы эта функция была реализована, сообщите об этом здесь для дальнейшего обсуждения.

person Milo Yip    schedule 16.11.2014
comment
В моем случае у меня есть json с двойниками. Я разбираю его, вношу небольшие изменения (добавляю новые элементы массива) и сериализую. Json постоянно получает огромное количество изменений из-за двойников в нем, и этот процесс бесконечен: в следующий раз, когда я вношу изменения, многие двойники меняются снова и снова. Мне либо нужно сохранить этот массив как сериализованную строку json (и мне нужно дважды проанализировать), либо мне нужно проанализировать json вручную - person Pavel P; 03.02.2020

Вроде можно:

{
    "hash": "00000000206d413bdd4d020a7df959176440e7b52f120f3416db11cb26aaaa8f", 
    "bigint": 13671375398414879143589706241811147679151753447299444772946167816777, 
    "time": "1551597576", 
    "special": false
}
rapidjson::Document document;
document.Parse<rapidjson::kParseNumbersAsStringsFlag>( JSONmessage );

std::cout << document["hash"].GetString() << std::endl;
std::cout << document["bigint"].GetString() << std::endl;

Источник: https://github.com/Tencent/rapidjson/issues/1458

person Saleem gagguturu    schedule 23.06.2019