JSON, JavaScript Object Notation, — это структура данных, которая не зависит от языка и платформы, легко читаема и доступна для записи. Поскольку он также основан на синтаксисе того, как объекты и их свойства представлены в JavaScript в текстурной форме, его легко создавать и использовать на JavaScript вашим клиентом веб-приложения в браузере.
JSON и JSON-P — Начало работы
Если вы не знакомы с JSON, загляните на сайт json.org, чтобы получить хороший обзор. Поскольку JSON-P API является частью EE7, вы также можете следовать разделу Учебное пособие по Java EE7 по JSON-P, в котором более подробно рассматривается API, чем я расскажу, но на самом деле все очень просто.
Давайте рассмотрим простой пример, чтобы начать — предполагая, что у нас есть документ JSON, представляющий Customer, который выглядит следующим образом:
{
"firstName" : "John",
"lastName" : "Smith",
"phoneNumber" : "111 222 1234"
}
Этот документ имеет 3 свойства: firstName, lastName и phoneNumber со значениями String.
Чтобы сгенерировать это с помощью Java-кода, мы могли бы сделать простую конкатенацию String имен статических свойств и добавить значения в String, но это неуклюже и подвержено ошибкам — вот где вступает API JSON-P. JSON-P использует «шаблон строителя» для добавления атрибутов в документ:
JsonObject jsonObject = Json.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("phoneNumber", "111 222 1234").build();
Json.createObjectBuilder () создает конструктор, и затем мы можем повторно вызывать метод add () для добавления наших атрибутов в документ, давая имя и значение атрибута. Когда мы завершили добавление атрибутов, мы вызываем метод build (), и он возвращает экземпляр JsonObject, который является объектным представлением документа, который мы только что создали.
Чтобы вернуть созданный документ в виде строки, используйте JsonWriter со строкой:
StringWriter sw = new StringWriter();
JsonWriter jsonWriter = Json.createWriter(sw);
jsonWriter.write(jsonObject);
jsonWriter.close();
String json = sw.toString();
Создание вложенных документов
Что если нам нужно создать что-то более сложное с вложенными документами? Если мы хотим представить наше свойство phoneNumber как вложенный документ для захвата типа телефонного номера, например:
{
"firstName" : "John",
"lastName" : "Smith",
"phoneNumber" : {
"phoneNumberType" : "home",
"number" : "111 222 1234"
}
}
Чтобы создать вложенный документ, мы можем снова использовать Json.createObjectBuilder (), чтобы создать вложенный документ, как мы это делали для внешнего документа, и присвоить его значение свойству phoneNumber, например:
JsonObject jsonObject = Json.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("phoneNumber", Json.createObjectBuilder()
.add("phoneNumberType", "home")
.add("number", "111 222 1234").build())
.build();
Создание массивов документов
Если в нашем примере нам нужно включить массив телефонных номеров разных типов (домашний, рабочий и т. Д.), То нам нужно использовать другой JSON-P API, JsonArrayBuilder. Если наш документ должен выглядеть так:
{
"firstName" : "John",
"lastName" : "Smith",
"phoneNumbers" : [
{
"phoneNumberType" : "home",
"number" : "111 222 1234"
},
{
"phoneNumberType" : "work",
"number" : "222 222 2244"
}
]
}
… тогда мы можем создать это так, разбив создание на два шага. Сначала создайте массив телефонных номеров, используя JsonArrayBuilder:
//build array of phone numbers using JsonArrayBuilder
JsonArrayBuilder phoneNumberArrayBuilder = Json.createArrayBuilder();
//create and add: home phone number
phoneNumberArrayBuilder.add(Json.createObjectBuilder()
.add("phoneNumberType", "home")
.add("number", "111 222 1234").build());
//create and add: work phone number
phoneNumberArrayBuilder.add(Json.createObjectBuilder()
.add("phoneNumberType", "work")
.add("number", "222 333 4444").build());
Затем создайте документ, как и раньше, и добавьте JsonArrayBuilder в качестве значения для свойства phoneNumbers:
//now build doc as before, including arraybuilder for the phoneNumbers array
JsonObject jsonObject = Json
.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Smith")
.add("phoneNumbers", phoneNumberArrayBuilder)
.build();
Резюме
В этой статье были представлены основные шаги, необходимые для создания документов JSON с использованием API-интерфейса JSON-P EE7 с использованием API-интерфейсов JsonObjectBuilder и JsonArrayBuilder. Этот подход создает объектную модель в памяти JSON-документа, которую можно при необходимости записать в строку. В качестве альтернативы, JSON-P API также включает в себя «потоковый» API, который может анализировать и создавать «на лету», аналогично подходу SAX API в JAXP для анализа XML.
Для получения дополнительной информации см .:
JSON-P ( JSR 353 ) — Java API для обработки JSON
Домашняя страница проекта JSON-P: https://jsonp.java.net/
Учебник по Java EE7 — JSON-P: http://docs.oracle.com/javaee/7/tutorial/doc/jsonp.htm