XStream库可以是将JSON从Java转换为XML来回转换的有效工具。
让我们逐一探究它们中的每一个,并查看使用了哪个驱动程序。
处理JSON
要将JSON转换为Java对象,您要做的就是使用适当的驱动程序初始化XStream对象,并准备将对象序列化到JSON(和从JSON序列化)。
XStream当前提供了两个用于JSON到对象ocnversion的驱动程序:
- JsonHierarchicalStreamDriver:
- 这没有附加的依赖关系,但是只能用于编写XML
- JettisonMappedXmlDriver:这是基于Jettison的,还可以再次将JSON反序列化为Java对象。
Jettison驱动程序
Jettison驱动程序使用Jettison StAX解析器读取和写入JSON格式的数据。 从1.2.2版开始,它在XStream中可用,并在com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver类中实现。
为了使此工作正常,我们需要在pom中添加依赖项:
<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的代码:
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
XStream xstream = new XStream(new StaxDriver()); xstream.toXML(xml); //converts Object to XML xstream.fromXML(obj); //Converts XML to Object
- DomDriver
XStream xstream = new XStream(new DomDriver()); xstream.toXML(xml); //converts Object to XML xstream.fromXML(obj); //Converts XML to Object
最后,让我们在一个类中查看所有这些内容:
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类进行测试:
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;@Beforepublic void init(){productTransformer = new Transformer<Product>();product = new Product(123,"Banana",23.00);}@Testpublic void testJSONToObject(){String json = productTransformer.getJSONFromObject(product);System.out.println(json);Product convertedproduct = productTransformer.getObjectFromJSON(json);System.out.println(convertedproduct.getName());}@Testpublic void testXMLtoObjectForStax(){String xml = productTransformer.getXMLFromObject(product);System.out.println(xml);Product convertedproduct = productTransformer.getObjectFromXML(xml);System.out.println(convertedproduct.getName());}@Testpublic void testXMLtoObjectForDom(){String xml = productTransformer.getXMLFromObjectUsingDomDriver(product);System.out.println(xml);Product convertedproduct = productTransformer.getObjectFromXMLUsingDomDriver(xml);System.out.println(convertedproduct.getName());}}
完整的代码可以在这里看到。
在下一个博客中,我们将比较用例,探索适合的用例。
翻译自: https://www.javacodegeeks.com/2014/07/converting-json-to-xml-to-java-objects-using-xstream.html