Изучаем Java EE 7 - [195]

Шрифт
Интервал

END_OBJECTСобытие для конца объекта JSON (генерируется, когда считан символ «}»)
START_ARRAYСобытие для начала массива JSON (генерируется, когда считан символ «[»)
END_ARRAYСобытие для конца массива JSON (генерируется, когда считан символ «]»)
KEY_NAMEСобытие для имени в паре «имя(ключ)/значение» объекта JSON
VALUE_STRINGСобытие для значения типа string
VALUE_NUMBERСобытие для значения типа number
VALUE_TRUEСобытие для значения true
VALUE_FALSEСобытие для значения false
VALUE_NULLСобытие для значения null

Класс в листинге 12.16 анализирует JSON, показанный выше (см. листинг 12.14) (сохраненный в файле order.json), для извлечения электронной почты клиента. Анализатор движется вперед, пока не встретит имя свойства email. Метод next() заставляет анализатор перейти в другое состояние. При этом будет возвращено следующее перечисление javax.json.stream.JsonParser.Event (см. табл. 12.11) для следующего состояния анализа. Когда анализатор достигает значения свойства email, он возвращает его.


Листинг 12.16. Класс OrderJsonParser, анализирующий представление информации о заказе в JSON

>public class OrderJsonParser {


>··public String parsePurchaseOrderAndReturnEmail() throws FileNotFoundException {

>····String email = null;


>····JsonParser parser = Json.createParser(new FileReader("src/main/resources/order.json"));

>····while (parser.hasNext()) {

>······JsonParser.Event event = parser.next();

>······while (parser.hasNext() &&!(event.equals(JsonParser.Event.KEY_NAME) &&

>···································parser.getString(). matches("email"))) {

>········event = parser.next();

>······}


>······if (event.equals(JsonParser.Event.KEY_NAME) && 

>·······················parser.getString(). matches("email")) {

>········parser.next();

>········email = parser.getString();

>······}

>····}

>····return email;

>··}

>}

Используя метод Event.equals(), можно определить тип события и обработать JSON в зависимости от него. В то время как JsonParser создает поток JSON, вы можете использовать метод getString(), чтобы получить строку, представляющую каждое имя (ключ) и значение в зависимости от состояния анализатора. Имя возвращается, если событие имеет тип KEY_NAME, строковое значение возвращается, если тип события — VALUE_STRING, а числовое значение будет возвращено, когда событие имеет тип VALUE_NUMBER. В дополнение к методу getString(), который возвращает строковое значение, можно использовать и другие методы, такие как getIntValue(), getLongValue() и getBigDecimalValue() в зависимости от типа.

Если во время анализа встретился неправильный формат данных, анализатор сгенерирует исключение времени выполнения, например javax.json.stream.JsonParsingException или java.lang.IllegalStateException, в зависимости от источника проблемы.

Генерация JSON

API строителя JSON позволяет создать структуру дерева JSON в памяти. JsonParser анализирует объект JSON с помощью потоков, в то время как объект типа javax.json.stream.JsonGenerator позволяет записывать JSON в поток, используя одно событие за раз.

Класс в листинге 12.17 использует метод createGenerator() основной фабрики javax.json.Json для получения объекта типа JsonGenerator и генерирует JSON-документ, приведенный ранее (см. листинг 12.14). Генератор пишет пары «имя/значение» в объекты JSON и массивы JSON.


Листинг 12.17. Создание объектов, представляющих информацию о заказе, в JSON

>public class OrderJsonGenerator {


>··public StringWriter generatePurchaseOrder() throws IOException {

>····StringWriter writer = new StringWriter();

>····JsonGenerator generator = Json.createGenerator(writer);

>····generator.writeStartObject()

>·············.write("id", "1234")

>·············.write("date", "05/06/2013")

>·············.writeStartObject("customer")

>···············.write("first_name", "Джеймс")

>···············.write("last_name", "Роррисон")

>···············.write("email", "[email protected]")

>···············.write("phoneNumber", "+44 1234 1234")

>·············.writeEnd()

>·············.writeStartArray("content")

>···············.writeStartObject()

>·················.write("item", "H2G2")

>·················.write("unit_price", "23.5")

>·················.write("quantity", "1")

>···············.writeEnd()

>···············.writeStartObject()

>·················.write("item", "Гарри Поттер")

>·················.write("unit_price", "34.99")

>·················.write("quantity", "2")

>···············.writeEnd()

>·············.writeEnd()

>·············.writeStartObject("credit_card")

>···············.write("number", "12 34123 41234")

>···············.write("expiry_date", "10/13")

>···············.write("control_number", "234")

>···············.write("type", "Visa")

>·············.writeEnd()

>···········.writeEnd()

>···········.close();

>····return writer;

>··}

>}

При генерации JSON необходимо быть знакомым с контекстом объектов и массивов. JSON-пары «имя/значение» могут быть записаны в объект, тогда как значения JSON — в виде массива. В то время как метод writeStartObject() записывает стартовый символ объекта JSON ({), метод writeStartArray() используется для записи стартового символа массива JSON ([). Каждый открытый контекст должен закрываться с помощью метода writeEnd(). После записи конца текущего контекста родительский контекст становится новым текущим.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.