Библиотека XStream может быть эффективным инструментом для преобразования JSON в Java в переводы XML туда и обратно.
Давайте рассмотрим каждый из них один за другим и посмотрим, какой драйвер используется.
Обработка JSON
Для преобразования JSON в объекты Java все, что вам нужно сделать, — это инициализировать объект XStream с помощью соответствующего драйвера, и вы готовы сериализовать свои объекты в (и из) JSON.
В настоящее время XStream поставляет два драйвера для JSON для Object ocnversion:
- JsonHierarchicalStreamDriver: это не имеет дополнительной зависимости, но может использоваться только для написания XML
- JettisonMappedXmlDriver: это основано на Jettison и может снова десериализовать JSON в объекты Java.
Водитель джеттисон
Драйвер Jettison использует анализатор Jettison StAX для чтения и записи данных в формате JSON. Он доступен в XStream начиная с версии 1.2.2 и реализован в классе com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver.
Чтобы это заработало, нам нужно добавить зависимости в pom:
01
02
03
04
05
06
07
08
09
10
11
12
|
< dependencies > < dependency > < groupId >com.thoughtworks.xstream</ groupId > < artifactId >xstream</ artifactId > < version >1.4.7</ version > </ dependency > < dependency > < groupId >org.codehaus.jettison</ groupId > < artifactId >jettison</ artifactId > < version >1.1</ version > </ dependency > </ dependencies > |
И код для преобразования JSON в объект и объект в Json:
1
2
3
|
XStream xstream = new XStream(new JettisonMappedXmlDriver()); xstream.toXML(xml); //converts Object to JSON xstream.fromXML(obj); //Converts Json to Object |
Сериализация объекта в XML
Для сериализации объекта в XML XStream использует 2 драйвера:
- StaxDriver
- DomDriver
1
2
3
|
XStream xstream = new XStream(new StaxDriver()); xstream.toXML(xml); //converts Object to XML xstream.fromXML(obj); //Converts XML to Object |
1
2
3
|
XStream xstream = new XStream(new DomDriver()); xstream.toXML(xml); //converts Object to XML xstream.fromXML(obj); //Converts XML to Object |
Наконец, давайте рассмотрим все это в одном классе:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package com.anirudh; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; import com.thoughtworks.xstream.io.xml.DomDriver; import com.thoughtworks.xstream.io.xml.StaxDriver; /** * Created by anirudh on 15/07/14. */ public class Transformer<T> { private static final XStream XSTREAM_INSTANCE = null ; public T getObjectFromJSON(String json){ return (T) getInstance().fromXML(json); } public String getJSONFromObject(T t){ return getInstance().toXML(t); } private XStream getInstance(){ if (XSTREAM_INSTANCE== null ){ return new XStream( new JettisonMappedXmlDriver()); } else { return XSTREAM_INSTANCE; } } public T getObjectFromXML(String xml){ return (T)getStaxDriverInstance().fromXML(xml); } public String getXMLFromObject(T t){ return getStaxDriverInstance().toXML(t); } public T getObjectFromXMLUsingDomDriver(String xml){ return (T)getDomDriverInstance().fromXML(xml); } public String getXMLFromObjectUsingDomDriver(T t){ return getDomDriverInstance().toXML(t); } private XStream getStaxDriverInstance(){ if (XSTREAM_INSTANCE== null ) { return new XStream( new StaxDriver()); } else { return XSTREAM_INSTANCE; } } private XStream getDomDriverInstance(){ if (XSTREAM_INSTANCE== null ){ return new XStream( new DomDriver()); } else { return XSTREAM_INSTANCE; } } } |
Напишите класс JUnit для его проверки:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package com.anirudh; import com.anirudh.domain.Product; import org.junit.Before; import org.junit.Test; /** * Created by anirudh on 15/07/14. */ public class TransformerTest { private Transformer<Product> productTransformer; private Product product; @Before public void init(){ productTransformer = new Transformer<Product>(); product = new Product( 123 , "Banana" , 23.00 ); } @Test public void testJSONToObject(){ String json = productTransformer.getJSONFromObject(product); System.out.println(json); Product convertedproduct = productTransformer.getObjectFromJSON(json); System.out.println(convertedproduct.getName()); } @Test public void testXMLtoObjectForStax(){ String xml = productTransformer.getXMLFromObject(product); System.out.println(xml); Product convertedproduct = productTransformer.getObjectFromXML(xml); System.out.println(convertedproduct.getName()); } @Test public void testXMLtoObjectForDom(){ String xml = productTransformer.getXMLFromObjectUsingDomDriver(product); System.out.println(xml); Product convertedproduct = productTransformer.getObjectFromXMLUsingDomDriver(xml); System.out.println(convertedproduct.getName()); } } |
Полный код можно увидеть здесь .
В следующем блоге мы сравним варианты использования, выяснив, куда вписывается.
Ссылка: | Преобразование JSON в XML для объектов Java с помощью XStream от нашего партнера по JCG Анируд Бхатнагар из блога anirudh bhatnagar . |