Создайте пустой 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()) );
}
Другие вопросы по тегам