在C ++ Builder中创建一个空的OPENARRAY

时间:2014-01-28 17:03:19

标签: c++builder superobject

我正在使用带有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的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您不能使用ARRAYOFCONST()OPENARRAY()来创建0元素的openarray。这些宏需要至少1个输入值。

我不熟悉SuperObject,但是如果O[]从现有值创建一个新的JSON数组并且A[]只是填充数组,那么您可以尝试使用SLICE()宏来创建和如果vv,则直接从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()) );
}