Создайте пустой OPENARRAY в C++Builder
Я использую C++Builder с парсером SuperObject JSON и пытаюсь создать массив.
_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 ответ
Вы не можете использовать ARRAYOFCONST()
или же OPENARRAY()
создать 0-элементный openarray. Этим макросам требуется минимум 1 входное значение.
Я не знаком с SuperObject, но если O[]
создает новый массив JSON из существующих значений и A[]
просто заполняет массив, вы можете попробовать использовать SLICE()
макрос для создания и заполнения openarray из v
напрямую, если v
это std::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()) );
}