【问题标题】:Does Google's GSON use constructors?Google 的 GSON 是否使用构造函数?
【发布时间】:2017-03-19 09:30:54
【问题描述】:

我在处理我们的项目时想知道一些事情。 Google 的 GSON API 是否使用您要反序列化的 JSON 的构造函数?比如:

我有一个 JSON 字符串,我想将其转换为 Employee 对象。 Employee 对象有一个构造函数,它对参数进行一些检查(例如,它的 ID > 0)。我们使用下面的代码来反序列化 JSON。但是,在将 JSON 反序列化为 Employee 时,是否还会调用此构造函数?

GSON 链接:https://github.com/google/gson

编辑: 所以在尝试了断点之后,我发现构造函数没有被调用。有人知道如何调用它吗?

/**
 * The GSON class to help you create and de-serialize the JSON objects.
 */
Gson gson = new Gson();

/**
 * Convert JSON to an object.
 * @param json The JSON to convert.
 * @param cls The class to convert to.
 * @return The converted JSON to object.
 */
public Object jsonToObject(String json, Class<?> cls) {
    return gson.fromJson(json, cls);
}

【问题讨论】:

  • 在构造函数中下断点,调试代码不行吗?
  • @RC。是的,你是对的,我只是测试了它并没有调用构造函数。
  • 我会假设它使用空构造函数来实例化对象,而读入的字段将直接使用反射设置。
  • 是的,我想通了。 @EpicPandaForce
  • 正如我在回答中所说,您需要实现自定义 JsonDeserializer 并从那里调用构造函数。 GSON 尚不支持调用构造函数。

标签: java json gson


【解决方案1】:

GSON、Jackson 或 Java Persistence API (JPA) 等库通常使用无参数(默认)构造函数来实例化对象并通过反射设置其字段。在较新版本的 GSON 中,您甚至不必再声明默认构造函数,请参阅 here

如果你必须在 GSON 中调用特定的构造函数,你可以实现一个自定义的JsonDeserializer,就像已经提到的here

在 Jackson 等其他库中,您可以在方法上定义反序列化,而不是字段(例如 GSON does),这样您就可以替换缺少的专用构造函数调用。

【讨论】:

  • Jackson 有一个注解 @JsonCreator 现在可以让您标记要用于序列化的构造函数。
猜你喜欢
  • 2013-09-09
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多