Как отличить ключ от значения при анализе строки JSON с помощью rapidjson?

Я анализирую строку JSON, используя «rapidjson». Я изучаю следующий пример анализа типа SAX объекта json.

https://github.com/miloyip/rapidjson/blob/75cee948d44876f22f7215b9bd64733c3d7fee51/example/simplereader/simplereader.cpp

В этом синтаксическом анализе типа SAX Rapidjson вызывает обработчик событий для каждого типа данных, полученных во время синтаксического анализа (в виде документов по адресу (https://github.com/miloyip/rapidjson/blob/2e0b3de8d68758b2866fff5f047c893b8a1c4290/doc/sax.md).)

Как я могу отличить, что данный элемент является ключом и значением, соответствующим этому ключу?


person balaji    schedule 17.07.2014    source источник


Ответы (1)


Вы можете различать ключи и значения только по порядку последовательности событий.

Когда Reader (парсер SAX) встречает объект JSON, он вызывает StartObject() обработчика. Затем будет последовательность пар ключ-значение. Ключ должен быть вызовом String(), но значение может быть любым типом значения JSON. И, наконец, вызывает EndObject().

Итак, вам нужно следить за состоянием парсинга. Для простой структуры просто нужно перечисление для представления текущего состояния. Для рекурсивной структуры вам может понадобиться собственный стек.

В этого раздела показан пример преобразования простого объекта в пользовательскую структуру данных. И он должен обрабатывать 3 состояния. Или вы можете использовать счетчик для количества вызовов String() и использовать нечетные/четные значения, чтобы определить, является ли это ключом или значением.

Иногда использование SAX API может быть более сложным. С другой стороны, он обеспечивает лучшую производительность и меньшую нагрузку на память.


Обновление: 2014/9/5

Запрос на вытягивание, который добавляет событие Key() в дополнение к String(), был объединен. Новый интерфейс должен упростить написание пользовательских обработчиков.

person Milo Yip    schedule 17.07.2014
comment
Большое спасибо за ответ. Я мог бы использовать enum, как это было предложено в вашем примере. - person balaji; 21.07.2014