Статьи

Преобразование JSON в XML для объектов Java с использованием XStream

Библиотека XStream может быть эффективным инструментом для преобразования JSON в Java в переводы XML туда и обратно.
Давайте рассмотрим каждый из них один за другим и посмотрим, какой драйвер используется.

Обработка JSON

Для преобразования JSON в объекты Java все, что вам нужно сделать, — это инициализировать объект XStream с помощью соответствующего драйвера, и вы готовы сериализовать свои объекты в (и из) JSON.

В настоящее время XStream поставляет два драйвера для JSON для Object ocnversion:

  1. JsonHierarchicalStreamDriver: это не имеет дополнительной зависимости, но может использоваться только для написания XML
  2. 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 драйвера:

  1. StaxDriver
  2. 1
    2
    3
    XStream xstream = new XStream(new StaxDriver());
    xstream.toXML(xml);  //converts Object to XML
    xstream.fromXML(obj); //Converts XML to Object

  3. DomDriver
  4. 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 .