如何使用整数作为键/名称将成员添加到rapidjson文档?

时间:2015-10-25 22:36:43

标签: c++ json rapidjson

我正在使用for循环,并希望在我向文档中添加成员时使用迭代器i作为键/名称。例如,我希望文档看起来像这样:

{ “1”: “123.321”, “2”: “456.654”}

这是我到目前为止所尝试的内容。

1。将i转换为const char *

(1,0)

这会产生编译错误,告诉我AddMember只能接受类型为rapidjson :: GenericValue&的参数:

rapidjson::Value newDouble(6);
for(int i = 0;i<laserScan.size();i++){
    newDouble.SetDouble(laserScan[i]);
    const char* index = std::to_string(i).c_str();
    d.AddMember(index,newDouble,d.GetAllocator());
}

2。使用rapidjson类型将i转换为字符串

error: no matching function for call to ‘rapidjson::GenericDocument<rapidjson::UTF8<> >::AddMember(const char*&, rapidjson::Value&, rapidjson::MemoryPoolAllocator<>&)’
     d.AddMember(index,newDouble,d.GetAllocator());//add this name-value pair to the JSON string

这将从Writer类抛出以下运行时错误:

rapidjson::Value newDouble(6), newStringIndex(5);
for(int i = 0;i<laserScan.size();i++){    
    newDouble.SetDouble(laserScan[i]);
    const char* index = std::to_string(i).c_str();
    size = (rapidjson::SizeType)std::strlen(index);
    newStringIndex.SetString(rapidjson::StringRef(index,size));
    d.AddMember(newStringIndex,newDouble,d.GetAllocator());
}

为什么我感到困惑

解决方案#1不应该与执行以下操作相同吗?

Assertion `!hasRoot_' failed.

当我尝试它时,这是有效的,但我无法弄清楚为什么不将整数转换为const char *。

2 个答案:

答案 0 :(得分:2)

虽然您已找到解决方法,但我想说明原始解决方案无法正常工作的原因。

解决方案#1的问题是,退出范围时<android.support.v7.widget.CardView android:layout_width="fill_parent" android:layout_height="fill_parent" card_view:cardCornerRadius="3dp" android:layout_marginTop="6dp" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" card_view:cardElevation="0.001dp" android:layout_marginBottom="0dp"> <RelativeLayout android:id="@+id/top_layout" android:layout_width="fill_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img_thumbnail" android:layout_width="fill_parent" android:layout_height="160dp" android:scaleType="centerCrop" /> <TextView android:id="@+id/tv_nature" android:layout_width="fill_parent" android:layout_height="25dp" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="2dp" android:paddingBottom="2dp" android:layout_marginTop="25dp" android:layout_marginBottom="25dp" android:alpha="0.8" android:textColor="#24B9FE" android:gravity="start" android:textSize="15sp" android:textStyle="bold" android:text="Test Test Test Test Test Test Test" android:layout_below="@+id/img_thumbnail" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" /> <Button android:id="@+id/button1" android:layout_width="40dp" android:layout_height="20dp" android:layout_alignParentRight="true" android:layout_alignTop="@+id/tv_nature" android:layout_marginRight="31dp" android:background="#24B9FE" android:text="Book" android:textColor="#ffffff" /> </RelativeLayout> </android.support.v7.widget.CardView> 指针无效。

tutorial中所述,您可以使用allocator创建一个密钥字符串来复制它:

index

对于您的解决方法,您可以简单地:

std::string s = std::to_string(i)
Value index(s.c_str(), s.size(), d.GetAllocator()); // copy string
d.AddMember(index, newDouble, d.GetAllocator());

答案 1 :(得分:1)

我找到了解决方法。我只是添加了键&#34;索引&#34;而不是将所有键都整数化。相应的值是所有索引的数组。然后我添加了一个名为&#34; data&#34;其中包含所有数据的数组:

rapidjson::Document document;
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
rapidjson::Value dataArray(rapidjson::kArrayType), ;

for(int i = 0;i<laserScan.size();i++){                 
    dataArray.PushBack(rapidjson::Value().SetDouble(laserScan[i]),allocator);
}
document.AddMember("data",dataArrary,allocator);