0

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

4

1 回答 1

2

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

我不熟悉 SuperObject,但如果O[]从现有值创建一个新的 JSON 数组并A[]简单地填充数组,您可以尝试使用宏直接从 if is aSLICE()创建和填充一个 openarray :vvstd::vector<TVarRec>

if (!v.empty())
    json->O["data.names"] = SA( SLICE(&v[0], v.size()) );

如果你真的需要一个 0 元素的 openarray,如果v它是空的,试试这个:

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()) );
}
于 2014-01-28T21:17:55.340 回答