如何把如下简单的JSON字符串反序列化为Java的POJO对象?
{"data":{"IM":["MSN","QQ","Gtalk"]}}
下面的POJO类Model无法完成正确的解析:
import com.google.gson.Gson; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Model { private Map<String, Map<String, List<String>>> data; public Map<String, Map<String, List<String>>> getData() { return data; } public void setData(Map<String, Map<String, List<String>>> data) { this.data = data; } } public class ModelTest { public static void main(String[] args) { List<String> ims = new ArrayList<String>(); ims.add("MSN"); ims.add("QQ"); ims.add("Gtalk"); Map<String, List<String>> map = new HashMap<String, List<String>>(); map.put("IM", ims); Map<String, Map<String, List<String>>> dataMap = new HashMap<String, Map<String, List<String>>>(); dataMap.put("data", map); String str = new Gson().toJson(dataMap); System.out.println(str);/*{"data":{"IM":["MSN","QQ","Gtalk"]}}*/ Model m = new Gson().fromJson(str, Model.class); } }
异常信息:
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 17 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) at com.google.gson.Gson.fromJson(Gson.java:803) at com.google.gson.Gson.fromJson(Gson.java:768) at com.google.gson.Gson.fromJson(Gson.java:717) at com.google.gson.Gson.fromJson(Gson.java:689) at gson.test4.ModelTest.main(ModelTest.java:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 17 at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:172) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187) at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) ... 10 more
如何解决这个问题?
仔细看了代码,出错是正常的事情。在代码中,str是从dataMap序列化而来,把这个由dataMap转换而来的JSON串str反序列为Model类型,出错是必然的
String str = new Gson().toJson(dataMap); Model m = new Gson().fromJson(str, Model.class)
那么Model对象序列化为JSON串的数据是什么样的呢?
{"data":{"data":{"IM":["MSN","QQ","Gtalk"]}}}
此时,解决的办法有两个:
1. 对于下面的JSON串,对应的数据结构是Map<String,Map<String,List<String>>>,直接把这个这个JSON串转成Map<String,Map<String,List<String>>>是可行的,比如如下的代码
{"data":{"IM":["MSN","QQ","Gtalk"]}}
将它转换为Map<String,Map<String,List<String>>>
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Model { private Map<String, Map<String, List<String>>> data; public Map<String, Map<String, List<String>>> getData() { return data; } public void setData(Map<String, Map<String, List<String>>> data) { this.data = data; } } public class ModelTest { public static void main(String[] args) { List<String> ims = new ArrayList<String>(); ims.add("MSN"); ims.add("QQ"); ims.add("Gtalk"); Map<String, List<String>> map = new HashMap<String, List<String>>(); map.put("IM", ims); Map<String, Map<String, List<String>>> dataMap = new HashMap<String, Map<String, List<String>>>(); dataMap.put("data", map); String str = new Gson().toJson(dataMap); System.out.println(str);/*{"data":{"IM":["MSN","QQ","Gtalk"]}}*/ Type type = new TypeToken<Map<String, Map<String, List<String>>>>(){}.getType(); dataMap = new Gson().fromJson(str, type); ims= dataMap.get("data").get("IM"); for(int i = 0; i< ims.size(); i++) { System.out.println(ims.get(i)); } } }
2.重新定义Model的数据结构,它包含的数据类型应该是private Map<String, List<String>> data;代码如下,此时可以正确解析了
import com.google.gson.Gson; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Model { private Map<String, List<String>> data; public Map<String, List<String>> getData() { return data; } public void setData(Map<String, List<String>> data) { this.data = data; } } public class ModelTest { public static void main(String[] args) { List<String> ims = new ArrayList<String>(); ims.add("MSN"); ims.add("QQ"); ims.add("Gtalk"); Map<String, List<String>> map = new HashMap<String, List<String>>(); map.put("IM", ims); Map<String, Map<String, List<String>>> dataMap = new HashMap<String, Map<String, List<String>>>(); dataMap.put("data", map); String str = new Gson().toJson(dataMap); System.out.println(str);/*{"data":{"IM":["MSN","QQ","Gtalk"]}}*/ Model m = new Gson().fromJson(str, Model.class); System.out.println(m!=null); } }
3.第三种方式,不使用Type,直接使用Map.class,这时没有使用范型,但是仍然可以得到正确的输出,这是为什么??
import com.google.gson.Gson; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Model { private Map<String, Map<String, List<String>>> data; public Map<String, Map<String, List<String>>> getData() { return data; } public void setData(Map<String, Map<String, List<String>>> data) { this.data = data; } } public class ModelTest { public static void main(String[] args) { List<String> ims = new ArrayList<String>(); ims.add("MSN"); ims.add("QQ"); ims.add("Gtalk"); Map<String, List<String>> map = new HashMap<String, List<String>>(); map.put("IM", ims); Map<String, Map<String, List<String>>> dataMap = new HashMap<String, Map<String, List<String>>>(); dataMap.put("data", map); String str = new Gson().toJson(dataMap); System.out.println(str);/*{"data":{"IM":["MSN","QQ","Gtalk"]}}*/ //Type type = new TypeToken<Map<String, Map<String, List<String>>>>(){}.getType(); //Map<String, Map<String, List<String>>> t = null; dataMap = new Gson().fromJson(str, Map.class); //不使用Type包装范型,为什么仍然正确? ims= dataMap.get("data").get("IM"); for(int i = 0; i< ims.size(); i++) { System.out.println(ims.get(i)); } } }
相关推荐
Maven坐标:com.google.code.gson:gson:2.8.7; 标签:google、gson、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
截止至2016-12-23,github上com.google.gson.Gson ...强大的json字符串解析功能及将字符串转换为json格式。才发现需要这么多分,大家也可以去网盘下载: https://pan.baidu.com/s/1d0JW_9G7iJPIJtjUbU91Jw 提取码: qtvm
gson-2.8.0.jar ...Gson 是google解析Json的一个开源框架。网上都说这个比fastJson,JackJso都要好,建议使用Gson。 解压后MD5:a42f1f5bfa4e6f123ddcab3de7e0ff81 大小:226 KB gson API 文档下载地址: ...
gson-2.6.2.jar包(com.google.code.gson:gson:2.6.2)不易,google无法下载这个jar包,可以自己下载下来,放到libs即可。
implementation ' com.google.code.gson:gson:2.8.5 ' } 使用文档 请使用框架返回的Gson对象来代替项目中的Gson对象 // 获取单例的 Gson 对象(已处理容错) Gson gson = GsonFactory . getSingletonGson(); 因为...
人工智能-机器学习-数据预处理
gson-2.8.7.jar
gson-2.5.8.jar,阿里云短信接口报错com.google.gson.JsonObject.keySet()Ljava/util/Set时,可以试试将这个替换原有的gson
这里进行介绍Gson解析复杂Json和简单Json的数据方式
JSON、GSON解析json数据,详细介绍了json和gson的使用,解析复杂json数据
1、Java 解析 Json 最常用的类库有:google 的 Gson、阿里巴巴的 FastJson、以及 Jackson。这些都是非常优秀而且常用的库。 2、GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以...
通过Gson解析Json文件,相关博文:http://www.cnblogs.com/tianzhijiexian/p/4246497.html
Gson解析流程图,详细的描述了Gson反射机制的解析流程
解放你的双手,不用再去一个一个JSONObject去处理解析问题,两行代码搞定一切
1、生成Json数据 2、使用Gson解析Json数据(单个json对象、json数组和json对象内嵌json数组) // 这里有两篇好心人的博文,有详细的讲解 http://www.jb51.net/article/32547.htm ...
Maven坐标:com.google.code.gson:gson:2.8.0; 标签:google、gson、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
Gson解析json,下载后打开zip文件即可得到里面gson2.8.0.jar导入AS工具即可使用
Gson解析json,实现泛型解析数据,根据用户传入的类型,解析称用户需要的,Common \CommonList 里面的status message data相关的约定可以更具开发者与服务器的约定修改
Json解析,Gson解析,本地,网络解析简单的案例
gson和jsonBean解析json案例