【发布时间】:2015-05-29 23:00:20
【问题描述】:
我在使用 Google 的库“gson”库将 gson 转换为 JSON 时遇到问题。我正在使用 Java Spark Web 框架,而 ResponseTransformer 是 Spark 库的一部分。模型参数变量可以是任何 POJO。
public class JsonTransformer implements ResponseTransformer {
private Gson gson = new Gson();
@Override
public String render(Object model) {
String json = null;
if (model instanceof java.util.List) {
model = ((java.util.List) model).get(0);
}
try {
json = gson.toJson(model);
} catch (Exception e) {
e.printStackTrace();
System.exit(5);
}
return json;
}
}
当模型是 List 对象时会出现某种问题,gson 库无法将其转换/序列化为 json 字符串。
因此,这只是尝试调试此问题的快速修复:如果模型是列表的实例,我正在尝试将模型重新分配给模型列表的第一个元素。所以这更像是一个基本的 Java 问题......当我尝试将模型重新分配给模型的第一个元素时,Java 不会让这种情况发生。为什么会这样?
另外,如果有人知道为什么 gson 在这种情况下如此失败,请 LMK。这不应该发生。没有明显的无限递归发生。
为了证明,下面是内容:
我得到了一个无限递归堆栈跟踪:
java.lang.StackOverflowError 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 在 com.google.gson.Gson.getAdapter(Gson.java:356)
我试图从 POJO 转换为 JSON 的对象如下所示:
public class Model {
private String id;
private String title;
private boolean done;
private Date createdOn;
public Model(BasicDBObject dbObject) {
this.id = ((ObjectId) dbObject.get("_id")).toString();
this.title = dbObject.getString("title") == null ? "placeholder title" : dbObject.getString("title");
this.done = ((Boolean)dbObject.getBoolean("done")) == null ? false : dbObject.getBoolean("done");
this.createdOn = dbObject.getDate("createdOn") == null ? new Date() : dbObject.getDate("createdOn");
}
}
【问题讨论】:
-
你能分享一下这个例外吗?
-
肯定会将其添加到问题中
-
程序试图将 Model 的 id 字段设置为 ArrayList 而不是 String 似乎存在某种问题......这很奇怪
-
@AlexanderMills 我现在遇到了同样的问题(遵循相同/类似的教程)。你最终得到了解决方案吗?
-
是的,我开始使用 Node.js,它比 Java 简单多了,哈哈