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

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

Метод writeStartObject() используется, чтобы начать новый контекст объекта-потомка, а метод writeStartArray() начинает новый контекст массива-потомка. Оба метода можно использовать только в контексте массива или если контекст еще не начался, и оба метода возможно вызвать, только когда контекста нет. Контекст начинается, когда вызван один из этих методов.

Класс JsonGenerator предоставляет и другие методы, такие как write(), чтобы записать пару «имя/значение» JSON в текущий контекст объекта или значение в текущий контекст массива.

Хотя метод flush() можно использовать для записи любых буферизованных выходных данных, метод close() закрывает генератор и освобождает все связанные с ним ресурсы.

Все вместе

Собрав все понятия этой главы, напишем POJO CreditCard с использованием JAXB и JSON-P, чтобы получить XML- и JSON-представление кредитной карты. Для проверки обоих форматов мы будем писать тесты. Класс CreditCardXMLTest выполняет маршалинг и демаршалинг объекта типа CreditCard, чтобы убедиться, что представление XML правильное. Класс CreditCardJSonTest проверяет, хорошо ли отформатирован также созданный JSON.

Написание класса CreditCard

Класс CreditCard в листинге 12.18 имеет JAXB-аннотацию @XmlRootElement, что позволяет выполнить его маршалинг в XML. Другая аннотация JAXB @XmlAccessorType с параметром XmlAccessType.FIELD указывает JAXB связывать атрибуты, а не геттеры.


Листинг 12.18. Класс CreditCard с аннотацией JAXB

>@XmlRootElement

>@XmlAccessorType(XmlAccessType.FIELD)

>public class CreditCard {

>··@XmlAttribute

>··private String number;

>··@XmlElement(name = "expiry_date")

>··private String expiryDate;

>··@XmlElement(name = "control_number")

>··private Integer controlNumber;

>··private String type;

>··//Конструкторы, методы работы со свойствами

>}

У объекта CreditCard есть такие базовые поля, как номер кредитной карты, дата истечения срока (в формате MM/YY), тип кредитной карты (Visa, Master Card, American Express и т. д.), а также контрольное число. Некоторые из этих атрибутов имеют аннотацию @XmlAttribute для преобразования в атрибут XML. Аннотация @XmlElement используется для замены имени элемента XML.

Написание теста CreditCardXMLTest

Класс CreditCardXMLTest, показанный в листинге 12.19, выполняет маршалинг и демаршалинг объекта типа CreditCard с использованием механизма маршалинга JAXB. Метод ShouldMarshallACreditCard создает экземпляр класса CreditCard и проверяет, имеет ли он правильное представление XML. Метод shouldUnmarshallACreditCard делает все наоборот — он выполняет демаршалинг XML-документа в объект типа CreditCard и убеждается, что значения объекта установлены правильно.


Листинг 12.19. Тест CreditCardXMLTest выполняет маршалинг и демаршалинг XML

>public class CreditCardXMLTest {

>··public static final String creditCardXML =

>·········"\n" +

>·········"\n" +

>·········"10/14\n" +

>·········"566\n" +

>·········"Visa\n" +

>·········"";


>··@Test

>··public void shouldMarshallACreditCard() throws JAXBException {


>····CreditCard creditCard = new CreditCard("123 45678", "10/14", 566, "Visa");


>····StringWriter writer = new StringWriter();

>····JAXBContext context = JAXBContext.newInstance(CreditCard.class);

>····Marshaller m = context.createMarshaller();

>····m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

>····m.marshal(creditCard, writer);


>····System.out.println(writer);


>····assertEquals(creditCardXML, writer.toString(). trim());

>··}


>··@Test

>··public void shouldUnmarshallACreditCard() throws JAXBException {

>····StringReader reader = new StringReader(creditCardXML);

>····JAXBContext context = JAXBContext.newInstance(CreditCard.class);

>····Unmarshaller u = context.createUnmarshaller();

>····CreditCard creditCard = (CreditCard) u.unmarshal(reader);


>····assertEquals("123 45678", creditCard.getNumber());

>····assertEquals("10/14", creditCard.getExpiryDate());

>····assertEquals((Object) 566, creditCard.getControlNumber());

>····assertEquals("Visa", creditCard.getType());

>··}

>}

Написание теста CreditCardJSonTest

Класс CreditCardJSonTest, показанный в листинге 12.20, использует API JsonGenerator для написания представления объекта CreditCard в JSON. Затем он проверяет, имеет ли JsonObject корректный синтаксис, сравнивая его с константой creditCardJSon.


Листинг 12.20. Тест CreditCardJSonTest генерирует JSon

>public class CreditCardJSonTest {

>··public static final String creditCardJSon =

>··········"{\"creditCard\":" +

>··················"{\"number\":\"123 45678\"," +

>··················"\"expiryDate\":\"10/14\"," +

>··················"\"controlNumber\":566," +

>··················"\"type\":\"Visa\"}" +

>··········"}";


>··@Test

>··public void shouldGenerateACreditCard(){

>····CreditCard creditCard = new CreditCard("123 45678", "10/14", 566, "Visa");


>····StringWriter writer = new StringWriter();

>····JsonGenerator generator = Json.createGenerator(writer);

>····generator.writeStartObject()

>·············.writeStartObject("creditCard")


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