Изучаем 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, он возвращает его.
>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.
>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(). После записи конца текущего контекста родительский контекст становится новым текущим.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.