Преобразуйте смешанный JSON-Number-Array в int, uint, float, используя lib rapidjson
Как я понял, этот символ * является допустимой строкой json.
const char* json = { "array":[14, -15, 3.17], "array_type": ["uint", "int", "float"] }
Все числа в массиве должны быть 4 байта.
Как можно пройти через массив с помощью fastjson?
Это мой код до сих пор:
#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. Как можно это решить?
Я знаю, что последнее "если" неверно, и, вероятно, именно поэтому программа падает. Double - 8 байтов, а SizeType - 4 байта по умолчанию.
Есть ли решение для цикла через массив?? Если нет, то я тоже был бы хорош с другими библиотеками. Мне нужно перенести эти три различных типа значений с помощью json. Кстати длина массива может быть от 1 до 500.
(Нет функции GetFloat().)
Спасибо за любую помощь. С уважением
1 ответ
Вы можете использовать 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
}
}