Есть ли библиотека для преобразования Java POJO в JSON и XML?

У меня есть граф объектов, который я хотел бы преобразовать в JSON и XML и из него, для создания API стиля REST. Мне кажется, что кто-то должен был это сделать уже, но быстрый поиск с использованием Google и Qaru ничего не показывает.

Кто-нибудь знает о подходящей (предпочтительной) библиотеке Apache или эквивалентной лицензии?

Ответ 1

GSON из google: http://code.google.com/p/google-gson/,

или

Джексон библиотека, используемая в spring: https://github.com/FasterXML/jackson

и я согласен с другими, предлагая jaxb для XML в pojo, хорошо поддерживая множество инструментов: его стандарт.

Ответ 2

Для POJO для XML я предлагаю использовать JAXB (есть и другие библиотеки, такие как XStream, например, JAXB стандартизован).

Для JSON я ничего не знаю, но если вы хотите реализовать RESTful API, вас может заинтересовать JSR-311 который определяет API-интерфейс на стороне сервера для API RESTful и Jersey, который является его эталонной реализацией.

Ответ 3

Использовать Xstream http://x-stream.github.io/ для xml и JSON http://www.json.org/java/ для JSON. Я не думаю, что есть одна библиотека, которая делает оба.

Или напишите обертку, которая делегирует рендерерам XStream/JSON в зависимости от того, что вы хотите.

Ответ 4

Я думаю, вы можете найти что-то похожее на то, что здесь: Раздел JSON.org Java

Ответ 5

Примечание. Я EclipseLink JAXB (MOXy) и член группы JAXB (JSR-222).

EclipseLink JAXB (MOXy) поддерживает сопоставление одной объектной модели как с XML, так и с JSON с теми же метаданными:

Информация о лицензии


DOMAIN MODEL

Ниже приведена модель домена, которую мы будем использовать для этого примера. В этом примере я просто использую стандартные JAXB (JSR-222) аннотации, которые доступны в JDK/JRE с Java SE 6.

Клиент

package forum658936;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    String firstName;

    @XmlElement(nillable=true)
    String lastName;

    @XmlElement(name="phone-number")
    List<PhoneNumber> phoneNumbers;

}

PhoneNumber

package forum658936;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {

    @XmlAttribute
    int id;

    @XmlValue
    String number;

}

jaxb.properties

Чтобы указать MOXy в качестве поставщика JAXB, вам необходимо включить файл с именем jaxb.properties в том же пакете, что и ваша модель домена, со следующей записью (см. <а4 > ).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

XML

Input.xml

Это XML, который наш демо-код будет читать и конвертировать в объекты домена.

<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firstName>Jane</firstName>
    <lastName xsi:nil="true"/>
    <phone-number id="123">555-1234</phone-number>
</customer>

Заметки о XML:


JSON

Выход

Ниже приведен JSON, который был выведен с помощью демонстрационного кода.

{
   "firstName" : "Jane",
   "lastName" : null,
   "phone-number" : [ {
      "id" : 123,
      "value" : "555-1234"
   } ]
}

Что нужно знать о JSON:

  • Значение null используется для представления, что lastName имеет значение null. Нет атрибута xsi:nil.
  • Сбор телефонных номеров имеет размер 1 и правильно связан квадратными скобками. Многие библиотеки неправильно рассматривают коллекции размером 1 как объекты JSON.
  • property типа int был правильно упорядочен без кавычек.
  • В представлении XML id был атрибут, но в представлении JSON нет необходимости его специально представлять.

DEMO CODE

В приведенном ниже демо-коде мы преобразуем XML-документ в объекты, а затем преобразуем те же экземпляры в JSON.

Demo

MOXy не просто интерпретирует аннотации JAXB, это реализация JAXB, поэтому используются стандартные API-интерфейсы JAXB. Связывание JSON разрешено с помощью указания MOXy указать свойства на Marshaller.

package forum658936;

import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum658936/input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
        marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
        marshaller.marshal(customer, System.out);
    }

}

Ответ 6

Json-lib лицензируется по лицензии Apache 2.0.

Он также может преобразовывать объекты JSON в XML, но вам сначала нужно преобразовать POJO в JSON.

Ответ 7

Лично я бы занялся этими двумя отдельно; и преобразовать JSON ↔ XML через JSON ↔ Pojo ↔ XML.

С этим: Java ↔ POJO с JAXB (http://jaxb.dev.java.net, также в комплекте с JDK 1.6) с аннотациями (XStream в порядке слишком); и для JSON, Jackson ObjectMapper (http://jackson.codehaus.org/Tutorial). Хорошо работает с Джерси, и я использую его сам (текущая версия Джерси не связывает полную привязку данных Pojo по умолчанию, но будет в ближайшем будущем)

Я бы на самом деле не использовал любую из xml-библиотек для создания "json": XStream и JAXB/Jettison могут создавать JSON, но используют уродливые соглашения, которые довольно не интуитивно понятны.

EDIT (18 июля 2011 г.): у Джексона есть расширение, называемое jackson-xml-databind", которое может читать/писать XML, аналогично JAXB. Таким образом, он может использоваться как для JSON, так и для XML, для/из POJO.

Ответ 8

Последнее, что я увидел на веб-сайте, XStream сделает и то, и другое. Он поддерживает XML и JSON в качестве целей сериализации.

Ответ 9

Есть почти буквально сотни. Моими фаворитами являются GSON для POJO ↔ JSON и castor-xml для POJO ↔ XML.

В качестве бонуса оба лицензируются по лицензии типа Apache License 2.0.

Ответ 10

Посмотрите на библиотеку Genson http://code.google.com/p/genson/wiki/GettingStarted.

Он прост в использовании, эффективен и разработан с учетом расширения. На самом деле это преобразование json/java, но не xml. Однако поддержка xml может быть добавлена ​​в будущую версию.

Я использую его в веб-приложениях и веб-службах REST в трикотаже, но также в некоторых случаях для хранения объектов в их json-форме в базе данных.

А и это под лицензией Apache 2.0.