【问题标题】:Transforming gson to JSON将 gson 转换为 JSON
【发布时间】: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 简单多了,哈哈

标签: java json gson


【解决方案1】:

您的问题在于 BasicDBObject 是默认构造函数参数。 格森不喜欢。删除它,它会工作。阅读:https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer

【讨论】:

  • 是的,但是我可以用 BasicDBObject 代替什么?
  • 只需重载构造函数,它是一个没有参数的无操作。如果您真的想强制 gson 使用该构造函数,那么您需要使用自定义 JsonDeserializer 并使用 gson 注册。
  • @AlexMills 如果解决方案对您有用,那么请您选择正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2015-02-23
相关资源
最近更新 更多