使用 gson 反序列化 json 字符串

Posted

技术标签:

【中文标题】使用 gson 反序列化 json 字符串【英文标题】:deserialize json string with gson 【发布时间】:2013-01-18 09:10:47 【问题描述】:

我的java servlet以这种方式返回一个json字符串:

Gson gson = new Gson();     
String lista = gson.toJson(utenti);
System.out.println(lista);
request.setAttribute("lista", lista);
request.getRequestDispatcher("GestioneUtenti.jsp").forward(request, response);

现在,在 jsp 页面中,我想再次拥​​有我的 arrayList。我尝试这样做:

<%
String lista = (String)request.getAttribute("lista");
Gson gson = new Gson();
ArrayList<Utente> users = gson.fromJson(lista, TypeToken.get(new ArrayList<Utente>().getClass()).getType());        
out.println(users.get(0).getUsername());
%>

我有这个例外:

java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to classi.Utente

你能帮帮我吗?如果我错过了一些细节告诉我!谢谢:-)

【问题讨论】:

试试这个作为你的类型令牌 - new TypeToken&lt;ArrayList&lt;Utente&gt;&gt;() . 为什么在Serlvet中将utenti序列化为JSON,然后反序列化回ArrayList,为什么不直接request.setAttribute("lista", utenti);呢? 【参考方案1】:

我用这段代码解决了:

String lista = (String)request.getAttribute("lista");
Gson gson = new Gson();                         
Type listType = new TypeToken<ArrayList<Utente>>() .getType();
ArrayList<Utente> users = new Gson().fromJson(lista, listType);

【讨论】:

我找到的最佳解决方案 非常有帮助...我用它来将 Firebase 远程配置 JSON 转换为 Java 对象列表。非常感谢。【参考方案2】:

这表明您有一个 StringMap,您已在其中声明了一个 Utente 类。错误的来源很可能是您的用户列表

【讨论】:

我无法理解... Utente 类已定义。我不知道在 fromjson() 方法的第二个参数中放什么 错误是说你期待一个 Utente 但实际上得到一个 StringMap,因此是 CCE

以上是关于使用 gson 反序列化 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Gson 在反序列化对象时忽略 null

Gson解析(序列化,反序列化)

如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON

Android 中使用Gson完成对象的序列化与反序列化

如何使用 Gson 反序列化 XMLGregorianCalender?

Gson - 反序列化未知类