2015-06-30 1 views
-2

Как я понял, char * является допустимой json-строкой.Преобразование смешанного JSON-Number-Array в int, uint, float с использованием lib rapidjson

const char* json = { "array":[14, -15, 3.17], "array_type": ["uint", "int", "float"] } 

Все числа в массиве должны быть 4 байта.

Как можно прокручивать массив с помощью quickjson?

Это мой код до сих пор:

#include "rapidjson/document.h" 

using namespace rapidjson; 

int main(void) 
{ 

int i_val; unsigned int ui_val; float f_val; 
const char* json = "{ \"array\":[14, -15, 3.17], \"array_type\" : [\"uint\", \"int\", \"float\"] }"; 

Document d; 

d.Parse<0>(json); 
Value& a = d["array"]; 
Value& at = d["array_type"]; 

for (SizeType i = 0; i<a.Size(); i++) 
{ 
    if (a[i].IsInt() && (std::string)at[i].GetString() == "int") 
    { 
     i_val = a[i].GetInt(); 
     //Do anything 
    } 
    if (a[i].IsUint() && (std::string)at[i].GetString() == "uint") 
    { 
     ui_val = a[i].GetUint(); 
     //Do anything 
    } 
    if (a[i].IsDouble() && (std::string)at[i].GetString() == "float") 
    { 
     f_val = (float)a[i].GetDouble(); 
     //Do anything 
    } 
}//end for 

    return 0; 
} 

ОШИБКА:

TestApp: /workspace/TestApp/src/include/rapidjson/document.h:1277: rapidjson::GenericValue<Encoding, Allocator>& rapidjson::GenericValue<Encoding, Allocator>::operator[](rapidjson::SizeType) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; rapidjson::SizeType = unsigned int]: Assertion `index < data_.a.size' failed. 

Код врезается в функции a.size(), когда она выполняется после GetDouble. Как можно это решить?

Я знаю, что последнее «если» неверно и, вероятно, поэтому программа вылетает из строя. Двойное значение равно 8 байтам, а размер TypeType по умолчанию равен 4 байтам.

Есть ли решение для петли, хотя массив? Если бы не я, я тоже был бы хорош с другими libs. Мне нужно передать эти три разных типа значений json. Кстати длина массива может быть от 1 до 500.

(Там нет функции GetFloat().)

Спасибо за какой-либо помощи. С уважением

ответ

0

Вы можете использовать JSONLint для проверки строки json. Ваш пример исправления:

int i_val; unsigned int ui_val; float f_val; 
const char* json = "{ \"array\":[14, -15, 3.17], \"array_type\" : [\"uint\", \"int\", \"float\"] }"; 
rapidjson::Document d; 

d.Parse<0>(json); 
rapidjson::Value& a = d["array"]; 
rapidjson::Value& at = d["array_type"]; 

for (rapidjson::SizeType i = 0; i<a.Size(); i++) 
{ 
    if (a[i].IsInt() && (std::string)at[i].GetString() == "int") 
    { 
     i_val = a[i].GetInt(); 
     //Do anything 
    } 
    if (a[i].IsUint() && (std::string)at[i].GetString() == "uint") 
    { 
     ui_val = a[i].GetUint(); 
     //Do anything 
    } 
    if (a[i].IsDouble() && (std::string)at[i].GetString() == "float") 
    { 
     f_val = (float)a[i].GetDouble(); 
     //Do anything 
    } 
} 
+0

Спасибо за ответ. Но у вас нет вопроса, который я предполагаю. –

+0

Код испорчен, из-за SizeType i. Я 4 байта, но когда я использую GetDouble, размер поврежден. –

+0

В этом случае подготовьте Short, Self Contained, Correct (Compilable), Пример, см. [Link] (http://sscce.org/) для деталей. – doqtor