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

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

Построение JSON

Структуры объекта и массива в JSON представлены классами javax.json.JsonObject и javax.json.JsonArray. API позволяет перемещаться и запрашивать древовидную структуру данных.

Класс JsonObject имеет словарный вид для доступа к неупорядоченному набору из нуля или более пар «имя/значение». Аналогично JSONArray предоставляет списковый вид для доступа к упорядоченной последовательности из нуля или более значений. API использует строительные шаблоны для создания древовидного представления JsonObject и JSONArray с помощью интерфейсов javax.json.JsonObjectBuilder и javax.json.JsonArrayBuilder.

В листинге 12.15 показано, как построить заказ в JSON, приведенный выше (см. листинг 12.14). Как видите, класс Json используется для создания объектов типов JsonObjectBuilder и JsonArrayBuilder, которые в конечном итоге создадут объект типа JsonObject (с применением финального метода build()). JsonObject предоставляет словарный вид для преобразований пар «имя/значение» объекта JSON.


Листинг 12.15. Класс OrderJsonBuilder создает объект JSON, содержащий информацию о заказе

>public class OrderJsonBuilder {

>··public JsonObject buildPurchaseOrder() {


>····return··Json.createObjectBuilder(). add("order", Json.createObjectBuilder()

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

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

>············.add("customer", Json.createObjectBuilder()

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

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

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

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

>············.add("content", Json.createObjectBuilder()

>················.add("order_line", Json.createArrayBuilder()

>····························.add(Json.createObjectBuilder()

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

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

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

>····························.add(Json.createObjectBuilder()

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

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

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

>············.add("credit_card", Json.createObjectBuilder()

>····················.add("number", "1357")

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

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

>····················.add("type", "Visa"))). build();

>··}

>}

Объект типа JsonObject также можно создать из источника входных данных (например, InputStream или Reader), используя интерфейс javax.json.JsonReader. В следующем примере показано, как считывать и создавать объект типа JsonObject с помощью интерфейса JsonReader. JsonReader создается из файла order.json (см. листинг 12.14). Затем, чтобы получить доступ к объекту order, вызывается метод getJsonObject(), который возвращает JsonObject. Если объект не найден, возвращается значение null:

>JsonReader reader = Json.createReader(new FileReader("order.json"));

>JsonObject jsonObject = reader.readObject();

>jsonObject = jsonObject.getJsonObject("order");

JsonReader также предоставляет общий метод read() для чтения любого подтипа javax.json.JsonStructure (JsonObject и JSONArray). Использование метода JsonStructure.getValueType() возвращает объект типа ValueType (ARRAY, OBJECT, STRING, NUMBER, TRUE, FALSE, NULL), а затем вы можете считать значение. Метод toString() типа JsonStructure возвращает JSON представление объектной модели.

Аналогично JsonObject и JSONArray можно записать в выходной источник (например, OutputStream или Writer) с помощью класса javax.json.JsonWriter. Метод-строитель Json.createWriter() может создать объект типа JsonWriter для различных типов вывода.

Анализ JSON

Потоковый API (пакет javax.json.stream) облегчает анализ JSON с помощью потоков, обеспечивая последовательный доступ только для чтения. Он предоставляет интерфейс javax.json.stream.JsonParser для анализа документов JSON. Точкой входа является класс-фабрика javax.json.Json, который имеет метод createParser(), возвращающий объект типа javax.json.stream.JsonParser из указанного источника входного сигнала (например, Reader или InputStream). К примеру, анализатор JSON, предназначенный для анализа пустого объекта JSON, можно создать следующим образом:

>StringReader reader = new StringReader("{}");

>JsonParser parser = Json.createParser(reader);

Вы можете настроить анализатор, передав в его метод createParserFactory() свойство Map. Эта фабрика создает объект типа JsonParser, сконфигурированный специально для анализа ваших данных JSON:

>StringReader reader = new StringReader("{}");

>JsonParserFactory factory = Json.createParserFactory(properties);

>JsonParser parser = factory.createParser(reader);

JsonParser основан на потоковой модели «активный синтаксический анализ». Это означает, что анализатор генерирует событие, когда достигнуто имя/значение JSON или считаны начало/конец массива/объекта. В табл. 12.11 перечислены все события, вызываемые анализатором.


Таблица 12.11. События анализатора JSon
ПакетОписание
START_OBJECTСобытие для начала объекта JSON (генерируется, когда считан символ «{»)

Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.