Есть ли библиотека для преобразования 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.