当Gson反序列化JSON时,是否可以使用setter?

时间:2014-05-14 16:33:11

标签: java json deserialization gson

使用Gson的fromJson方法时,是否有任何方法可以使用给定类的set方法?

我想这样做,因为对于目标类的每个String全局变量都会进行修剪。

是否有针对此的GSON API注释?

我知道GSON提供了编写自定义序列化器/反序列化器的能力,但我想知道是否有另一种方法可以实现这一点。

2 个答案:

答案 0 :(得分:13)

,没有。 Gson主要通过实例字段的反射来工作。因此,如果你不打算转移到具有此功能的杰克逊,我认为你不能有一般的方式来打电话给你的安装人员。所以没有注释。

<强> BUT

为了满足您的特定需求,您可以:

  1. 编写您自己的自定义TypeAdapter
  2. 创建一个构造函数,其中包含您要修剪的字符串并创建自定义InstanceCreator
  3. 将您的JSON解析为JsonObject,对字符串进行一些处理,然后将该对象用作解析到您的类中的源。
  4. 只要您发布一些代码或提供有关您的数据/ JSON的信息,我就可以为您提供更多提示。

答案 1 :(得分:3)

我实施了JsonDeserializer<String>并在GsonBuilder上注册了它。因此,对于收到的所有String字段,Gson将使用我的StringGsonTypeAdapter反序列化该值。

以下是我的代码:

import static net.hugonardo.java.commons.text.StringUtils.normalizeSpace;
import static net.hugonardo.java.commons.text.StringUtils.trimToNull;

final class StringGsonTypeAdapter implements JsonDeserializer<String> {

    private static final StringGsonTypeAdapter INSTANCE = new StringGsonTypeAdapter();

    static StringGsonTypeAdapter instance() {
        return INSTANCE;
    }

    @Override
    public String deserialize(JsonElement jsonElement, Type type, 
        JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        return normalizeSpace(trimToNull(jsonElement.getAsString()));
    }
}

...和我的GsonBuilder:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(String.class, StringGsonTypeAdapter.instance())
    .create())