Gson-Xml Android xml转object对象
发布时间:2020-12-16 08:42:58 所属栏目:百科 来源:网络整理
导读:链接: 原始版本 改动后的版本 改动: 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-jav
链接: 原始版本 项目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()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- atitit.ajax bp dwr 3.的注解方式配置使用流程总结 VO9o...
- c# – 转换JSON日期时间2017-03-19T23:54:46至2017年3月1
- ruby-on-rails – 拒绝连接(PGError)(postgresql和rails)
- PostgreSQL 9.0 beta1版发布
- cocos2d-x学习笔记
- applicationContext-security.xml
- 域驱动设计 – DDD – 强制使用具有小聚合根的不变量
- iphone – 重置Facebook权限iOS SDK
- 无法通过身份验证向mailgun发送ajax请求
- c# – 我可以在Windows服务中托管(自托管)WCF服务并通过htt