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();
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
В этом разделе описываются четыре варианта использования API объектной модели: создание объектной модели из данных 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
Объектные модели, созданные в Создание объектной модели из данных 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);
Назад | Вперёд | Содержание |