множественные json-привязки в java - PullRequest
4 голосов
/ 25 октября 2011

Java имеет несколько структур связывания XML, которые отображают объекты Java в XML и обратно. Эти структуры позволяют отображать различные иерархии и классы Java в выбранную структуру XML. Они могут быть настроены через отдельный файл конфигурации. Эти платформы включают в себя Castor, JiBX и тому подобное. Другие платформы могут быть настроены программно.

Большинство сред связывания JSON просто отображают объект Java непосредственно в json. Большинство из них не расширяют гибкость преобразования сложных иерархий Java в любое произвольно выбранное представление объекта JSON. Конфигурация обычно довольно ограничена.

В настоящее время я пытаюсь создать веб-сервис, который возвращает ответы json. Если мои классы доменов Java изменятся каким-либо образом, мои json-ответы также изменятся, что приведет к поломке любых клиентов служб, ожидающих, что старая версия json-ответов.

Существуют ли какие-либо полностью гибкие структуры привязки JSON, которые могут отображать несколько привязок в один и тот же набор классов?

Или (возможно, более фундаментальный вопрос), как мне поддерживать разные версии привязок JSON в одном и том же наборе классов Java?

Или я просто должен убедиться, что классы моего домена никогда не меняются? (Это не представляется возможным)

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Примечание: Я EclipseLink JAXB (MOXy) , и член JAXB 2 (JSR- 22) экспертная группа.

Компонент MOXy в EclipseLink 2.4 будет содержать тип привязки JSON, который вы ищете. В приведенном ниже примере объект Address сопоставлен с ответом запуска API геокодирования Google V2 . Этот пример демонстрирует, как сопоставление на основе пути устраняет необходимость в тесной взаимосвязи между классами и структурой JSON.

package blog.geocode.json;

import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
    private String street;

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:LocalityName/text()")
    private String city;

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
    private String state;

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
    private String country;

    @XmlPath("Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
    private String postalCode;

}

Как вы упомянули, наличие отдельного документа сопоставления является ключом к применению нескольких сопоставлений в объектной модели. Документ привязки MOXy можно использовать для привязки XML и JSON:

Вы можете попробовать связывание JSON сегодня, используя одну из основных сборок:

1 голос
/ 25 октября 2011

Если вы используете JAXB в сочетании с JAX-RS (Java API для веб-сервисов RESTful), это легко.JAX-RS (или, по крайней мере, Джерси , эталонная реализация JAX-RS) понимает аннотации JAXB, и чтобы он выводил JSON вместо XML, вам нужно всего лишь изменить тип мультимедиа вашего метода веб-сервиса, например:

@GET @Path("{customerId}")
@Produces(MediaType.TEXT_XML)  // Change this to MediaType.APPLICATION_JSON
public Customer getCustomer(@PathParam("customerId") String customerId) {
    // ...
}

Где Customer - класс, аннотированный с помощью аннотаций сопоставления JAXB (который может относиться к другим классам с аннотациями и т. Д.).

0 голосов
/ 25 октября 2011

Хороший вопрос.Я боролся с собой в немного большем масштабе.

Проблема в том, что сериализация объекта нарушает инкапсуляцию.Но затем, так же, как и отображение на пользовательском интерфейсе.Но если вы этого не сделаете, что хорошего в этом?

Единственное решение, которое мне удалось найти, - это создать View Object.В объекте представления есть методы получения и установки, которые позволяют экстернализацию частей представления данных без каких-либо личных данных, необходимых для фактической обработки.

Проблема в том, что для этого требуется некоторое дублирующее кодирование, но, похоже,предотвратить некоторые долгосрочные архитектурные проблемы.

Извините, что я не более полезен, но это только одна из тех неприятных проблем, с которыми инженеры программного обеспечения будут бороться вечно.

Мои $ .02.

...