使用lib rapidjson将混合的JSON-Number-Array转换为int,uint,float

时间:2015-06-30 16:37:36

标签: c++ c arrays json rapidjson

据我所知,这个char *是一个有效的json-string。

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

数组中的所有数字都应为4个字节。

如何使用rapidjson循环遍历数组?

到目前为止,这是我的代码:

#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;
}

ERROR:

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.

在GetDouble之后执行代码时,代码在函数a.Size()处崩溃。怎么能解决这个问题?

我知道最后一次&#34; if&#34;这是错误的,这可能是程序崩溃的原因。 Double是8个字节,默认情况下SizeType是4个字节。

有没有解决方案循环数组?如果不是我也会很好用其他的库..我需要通过json传输这三种不同类型的值。顺便说一下,阵列的长度可以是1到500。

(没有GetFloat()函数。)

感谢您提供任何帮助。 此致

1 个答案:

答案 0 :(得分: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
    }
}