Статьи

EE7 JSON-P API в двух словах

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