Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование API объектной модели

В этом разделе описываются четыре варианта использования API объектной модели: создание объектной модели из данных JSON, создание объектной модели из кода приложения, навигация по объектной модели и запись объектной модели в поток.

Здесь рассматриваются следующие темы:

Создание объектной модели из данных JSON

Следующий код демонстрирует, как создать объектную модель из данных JSON в текстовом файле:

import java.io.FileReader;
import javax.json.Json;
import javax.json.JsonReader;
import javax.json.JsonStructure;
...
JsonReader reader = Json.createReader(new FileReader("jsondata.txt"));
JsonStructure jsonst = reader.read();

Ссылка на объект jsonst может иметь тип JsonObject или тип JsonArray, в зависимости от содержимого файла. JsonObject и JsonArray являются подтипами JsonStructure. Эта ссылка представляет вершину дерева и может использоваться для навигации по дереву или для записи его в поток в виде данных JSON.

Создание объектной модели в коде приложения

Следующий код демонстрирует, как создать объектную модель из кода приложения:

import javax.json.Json;
import javax.json.JsonObject;
...
JsonObject model = Json.createObjectBuilder()
   .add("firstName", "Duke")
   .add("lastName", "Java")
   .add("age", 18)
   .add("streetAddress", "100 Internet Dr")
   .add("city", "JavaTown")
   .add("state", "JA")
   .add("postalCode", "12345")
   .add("phoneNumbers", Json.createArrayBuilder()
      .add(Json.createObjectBuilder()
         .add("type", "mobile")
         .add("number", "111-111-1111"))
      .add(Json.createObjectBuilder()
         .add("type", "home")
         .add("number", "222-222-2222")))
   .build();

Ссылка на объект model представляет вершину дерева, которая создаётся путём вложенных вызовов методов add и затем вызова метода build. Класс JsonObjectBuilder содержит следующие методы add:

JsonObjectBuilder add(String name, BigDecimal value)
JsonObjectBuilder add(String name, BigInteger value)
JsonObjectBuilder add(String name, boolean value)
JsonObjectBuilder add(String name, double value)
JsonObjectBuilder add(String name, int value)
JsonObjectBuilder add(String name, JsonArrayBuilder builder)
JsonObjectBuilder add(String name, JsonObjectBuilder builder)
JsonObjectBuilder add(String name, JsonValue value)
JsonObjectBuilder add(String name, long value)
JsonObjectBuilder add(String name, String value)
JsonObjectBuilder addNull(String name)

Класс JsonArrayBuilder содержит похожие методы add, которые не имеют параметра name (key). Вы можете вложить массивы и объекты, передав новый объект JsonArrayBuilder или новый объект JsonObjectBuilder соответствующему методу add, как показано в этом примере.

Результирующее дерево представляет данные JSON из Синтаксиса JSON.

Следующий код демонстрирует простой подход к навигации по объектной модели:

import javax.json.JsonValue;
import javax.json.JsonObject;
import javax.json.JsonArray;
import javax.json.JsonNumber;
import javax.json.JsonString;
...
public static void navigateTree(JsonValue tree, String key) {
   if (key != null)
      System.out.print("Key " + key + ": ");
   switch(tree.getValueType()) {
      case OBJECT:
         System.out.println("OBJECT");
         JsonObject object = (JsonObject) tree;
         for (String name : object.keySet())
            navigateTree(object.get(name), name);
         break;
      case ARRAY:
         System.out.println("ARRAY");
         JsonArray array = (JsonArray) tree;
         for (JsonValue val : array)
            navigateTree(val, null);
         break;
      case STRING:
         JsonString st = (JsonString) tree;
         System.out.println("STRING " + st.getString());
         break;
      case NUMBER:
         JsonNumber num = (JsonNumber) tree;
         System.out.println("NUMBER " + num.toString());
         break;
      case TRUE:
      case FALSE:
      case NULL:
         System.out.println(tree.getValueType().toString());
         break;
   }
}

Метод navigateTree может использоваться с моделями, построенными в Создание объектной модели из данных JSON и Создание объектной модели в коде приложения следующим образом:

navigateTree(model, null);

Метод navigateTree принимает два аргумента: элемент JSON и ключ. Ключ используется только для распечатки пар ключ-значение внутри объектов. Элементы в дереве представлены типом JsonValue. Если элемент является объектом или массивом, новый вызов этого метода выполняется для каждого элемента, содержащегося в объекте или массиве. Если элемент является значением, он выводится в стандартный вывод.

Метод JsonValue.getValueType идентифицирует элемент как объект, массив или значение. Для объектов метод JsonObject.keySet возвращает набор строк, содержащий ключи в объекте, а метод JsonObject.get(String name) возвращает значение элемент с ключом name. Для массивов JsonArray реализует интерфейс List<JsonValue>. Вы можете использовать расширенные циклы for с объектом Set<String>, возвращаемым JsonObject.keySet и с объектами JsonArray, как показано в этом примере.

Метод navigateTree для модели, встроенной в Создание объектной модели из кода приложения, производит следующий вывод:

OBJECT
Key firstName: STRING Duke
Key lastName: STRING Java
Key age: NUMBER 18
Key streetAddress: STRING 100 Internet Dr
Key city: STRING JavaTown
Key state: STRING JA
Key postalCode: STRING 12345
Key phoneNumbers: ARRAY
OBJECT
Key type: STRING mobile
Key number: STRING 111-111-1111
OBJECT
Key type: STRING home
Key number: STRING 222-222-2222

Запись объектной модели в поток (Stream)

Объектные модели, созданные в Создание объектной модели из данных JSON и Создание объектной модели из кода приложения, могут быть записаны в поток с использованием класса JsonWriter следующим образом:

import java.io.StringWriter;
import javax.json.JsonWriter;
...
StringWriter stWriter = new StringWriter();
JsonWriter jsonWriter = Json.createWriter(stWriter);
jsonWriter.writeObject(model);
jsonWriter.close();

String jsonData = stWriter.toString();
System.out.println(jsonData);

Метод Json.createWriter принимает выходной поток в качестве параметра. Метод JsonWriter.writeObject записывает объект в поток. Метод JsonWriter.close закрывает выходной поток.

В следующем примере используется try-with-resources для автоматического закрытия записи JSON:

StringWriter stWriter = new StringWriter();
try (JsonWriter jsonWriter = Json.createWriter(stWriter)) {
   jsonWriter.writeObject(model);
}

String jsonData = stWriter.toString();
System.out.println(jsonData);

Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)