我正在使用带有SuperObject JSON解析器的C ++ Builder,并试图构造一个数组。
_di_ISuperObject json = SO("{}");
json->O["data.names"] = SA(ARRAYOFCONST(("")));
for (int i=0; i < v.size(); ++i)
json->A["data.names"]->S[i] = v[i];
现在,上面的代码实现了我想要的 - 除非v.size() == 0
。在这种情况下,我得到一个数组,其中包含一个“空”字符串。
这是因为使用ARRAYOFCONST((""))
创建了'虚拟'数组。
创建'空'OPENARRAY
以传递给SuperObject的正确方法是什么?
答案 0 :(得分:2)
您不能使用ARRAYOFCONST()
或OPENARRAY()
来创建0元素的openarray。这些宏需要至少1个输入值。
我不熟悉SuperObject,但是如果O[]
从现有值创建一个新的JSON数组并且A[]
只是填充数组,那么您可以尝试使用SLICE()
宏来创建和如果v
是v
,则直接从std::vector<TVarRec>
填充一个空心阵列:
if (!v.empty())
json->O["data.names"] = SA( SLICE(&v[0], v.size()) );
如果v
为空,如果你真的需要一个0元素的openarray,请试试这个:
if (v.empty())
json->O["data.names"] = SA( NULL, -1 );
else
json->O["data.names"] = SA( SLICE(&v[0], v.size()) );
如果v
不包含TVarRec
值,那么您可以先创建一个单独的std::vector<TVarRec>
,然后再创建SLICE()
到SuperObject中(因为TVarRec
要小心不对引用计数数据类型执行引用计数,例如字符串 - 按设计 - 因此请确保在分配TVarRec
值时不会创建临时值,否则它们将被泄露! ):
if (v.empty())
json->O["data.names"] = SA( NULL, -1 );
else
{
std:vector<TVarRec> tmp(v.size());
for (size_t idx = 0; idx < v.size(); ++idx)
tmp[idx] = v[idx];
json->O["data.names"] = SA( SLICE(&tmp[0], tmp.size()) );
}