我正在使用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 *。
答案 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);