链接:
原始版本
改动后的版本
改动:
1.在java项目,xml转义问题
2.对map的支持
项目Gradle引用
gradle
compile('com.stanfy:gson-xml-java:0.1.+') { exclude group: 'xmlpull',module: 'xmlpull' } //如果想更新gson的版本 compile('com.stanfy:gson-xml-java:0.1.+') { exclude group: 'xmlpull',module: 'xmlpull' exclude group: 'com.google.code.gson',module: 'gson' } compile 'com.google.code.gson:gson:2.6.1'
eclipse则需要把gson的jar以及gsom-xml的jar引用即可。
示例github代码
package com.stanfy.gsonxml.test; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.annotations.Serializedname; import com.google.gson.reflect.Typetoken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.stanfy.gsonxml.GsonXmlBuilder; import org.junit.Test; import java.io.IOException; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; public class DemoTest extends AbstractXmlTest { public static class A { public A() { maps = new LinkedHashMap<String,B>(); } //@代表这个字段是属性,属性一般不支持复杂类型 @Serializedname("@id") long id; //不带@则是子标签 @Serializedname("name") List<String> names; @Serializedname("b") List<B> bs; @Serializedname("id") int[] is; @Serializedname(value = "map") Map<String,B> maps; //List<MyMap> maps; @Serializedname("type") C c; } public static class MyMap { @Serializedname("key") String key; @Serializedname("value") B value; } public static class B { @Serializedname("@id") long id; //$则是xml的标签内文字 @Serializedname("$") String text; @Serializedname("@type") C c; } public enum C { a,b,c } final static String TEST_XML = " <a id=\"123\">" + " <name>test name1</name>" + " <name>test name2</name>" + " <b id=\"1234567890\">b name1</b>" + " <b id=\"0123\">b name2</b>" + " <map>" + " <key>hello</key>" + " <value id=\"1\">world</value>" + " </map>" + " <map>" + " <value id=\"1\" type=\"a\" >name</value>" + " <key>hello2</key>" + " </map>" + " <id>1</id>" + " <id>2</id>" + " <id>3</id>" + " <type>b</type>" + "</a>"; final static String TEST_XML_MAP = " <a>" + " <map>" + " <key>hello</key>" + " <value id=\"1\">world</value>" + " </map>" + " <map>" + " <value id=\"1\" type=\"a\" >name</value>" + " <key>hello2</key>" + " </map>" + "</a>"; @Test public void test() { //复杂对象的转换 GsonBuilder builder = new GsonBuilder(); builder.enableComplexMapKeySerialization(); //自定义Enum显示为字符串 builder.registerTypeAdapter(C.class,new TypeAdapter<C>() { @Override public C read(JsonReader in) throws IOException { String value = in.nextString(); C[] cs = C.values(); for (C c : cs) { if (c.toString().equalsIgnoreCase(value)) { return c; } } return null; } @Override public void write(JsonWriter out,C value) throws IOException { out.value(value == null ? "" : value.toString()); } }); final A a = new GsonXmlBuilder() .setXmlParserCreator(SimpleXmlReaderTest.PARSER_CREATOR) .wrap(builder) .setPrimitiveArrays(true) .setSameNameLists(true) .create() .fromXml(TEST_XML,A.class); assertEquals("test name2",a.names.get(1)); assertEquals(1234567890,a.bs.get(0).id); assertEquals("b name2",a.bs.get(1).text); assertEquals(2,a.bs.size()); assertEquals(C.b,a.c); assertEquals("world",a.maps.get("hello").text); assertEquals("name",a.maps.get("hello2").text); assertEquals(C.a,a.maps.get("hello2").c); assertEquals(2,a.maps.size()); assertEquals(3,a.is.length); assertEquals(LinkedHashMap.class,a.maps.getClass()); // assertEquals(2,a.maps.get(1).value.id); } @Test public void testRootMap() { //单个map对象的转换 GsonBuilder builder = new GsonBuilder(); builder.enableComplexMapKeySerialization(); //自定义Enum显示为字符串 builder.registerTypeAdapter(C.class,C value) throws IOException { out.value(value == null ? "" : value.toString()); } }); Map<String,B> maps = new GsonXmlBuilder() .setXmlParserCreator(SimpleXmlReaderTest.PARSER_CREATOR) .wrap(builder) //跳过跟标签,单map,list必须设置 .setSkipRoot(true) //map必须设置 .setPrimitiveArrays(true) //map必须设置 .setSameNameLists(true) .create() .fromXml(TEST_XML_MAP,new Typetoken<Map<String,B>>() { }.getType()); assertEquals("world",maps.get("hello").text); assertEquals("name",maps.get("hello2").text); assertEquals(C.a,maps.get("hello2").c); assertEquals(2,maps.size()); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。