Анализ массива json определенного формата в Qt4, без внешних библиотек

Мне нужно извлечь данные из массива JSON, формат '[[[1,2,3]],[[1,2,3],[1,2,3]],"строка"]' в Qt. логически это '[[[значения x]],[[значения y1],[значения y2]],"комментарии"]'.

Изменить: массивы x, y1, y2 могут иметь размер до 1000+ элементов.

Я знаю, что это точный формат (без одинарных кавычек) и что он не изменится.

Что мне действительно нужно, так это QVector xval, y1val; .

Как бы я разобрал это?

(Я новичок в Qt, поэтому, пожалуйста, простите меня, если я упускаю очевидное.)


person McEnroe    schedule 20.10.2012    source источник
comment
Я бы никогда не подумал, что формат никогда не изменится. Структура JSON может никогда не измениться, но форматирование может. По крайней мере, подготовьтесь к пробелам между токенами, которые полностью разрешены в JSON.   -  person Stephen Chu    schedule 21.10.2012
comment
Под этим я подразумеваю, что все мое приложение основано на анализе этой строки. Это означает, что если другой конец должен внести изменения, мне все равно придется скорректировать свой код. Я хочу сказать, что между последующими запросами не будет разницы.   -  person McEnroe    schedule 22.10.2012


Ответы (1)


Быстрое и грязное решение:

QString s = "[[[1,2,3]],[[4,5,6],[7,8,9]],\"string\"]";
QStringList parts = s.remove("[").remove("]").split(',');

QVector<int> xval, yval;
if (parts.size() >= 6)
{
    xval << parts[0].toInt() << parts[1].toInt() << parts[2].toInt();
    yval << parts[3].toInt() << parts[4].toInt() << parts[5].toInt();
}

Изменить: теперь поддерживаются массивы переменной длины:

QVector<int> ToIntList(const QString& s)
{
    QVector<int> result;
    QStringList parts = s.trimmed().split(",");
    for (int i = 0; i < parts.size(); ++i)
        result << parts[i].toInt();
    return result;
}

QString s = "[[[1,2,3,4,5,6, 7,  8]],[[9\n,10], [11,12,13]],\"string\"]";
QStringList lists = s.remove(" ").split("],[");

for (int i = 0; i < lists.size(); ++i)
    lists[i] = lists[i].remove("[").remove("]");

QVector<int> xval, yval;
if (lists.size() >= 2)
{
    xval = ToIntList(lists[0]);
    yval = ToIntList(lists[1]);
}
person Community    schedule 21.10.2012
comment
Извините, я думаю, что то, что я написал, было немного двусмысленным. Я отредактировал свой вопрос, чтобы отразить, что массивы не имеют буквально трех элементов, но могут иметь произвольную длину. - person McEnroe; 22.10.2012
comment
Делает именно то, что я хотел! Спасибо. - person McEnroe; 23.10.2012