如何将Gson扩展为构造函数并为任何类型生成默认对象?

时间:2013-10-21 05:02:24

标签: java json reflection gson

全部,

Gson激励了我很多,现在我将Gson扩展为使用一些自定义默认值来构建任何其他类型的对象。我应该重写Gson的哪一部分?我真的想重用Gson反射并支持基本类型。但我发现在审查其源代码后,根据当前Gson的设计有一些困难。

现在我的要求可以表示如下:

我定义了一个POJO类,例如:

TestInputParam.class:

public class TestInputParam{
    private Date startTime;
    private String name;
    private int num;

    //setters and gettters
}

要求:

GsonEx<TestInputParam> gsonEx = new GsonEx<TestInputParam>();
TestInputParam defaultParam = gsonEx.build(TestInputParam.class) 

System.out.println(new Gson().toJson(defaultParam));

结果:

It should output this object default value .

备注:

我的理解是:new Gson()。fromJson(stringContent,type)通过JsonReader用StringContent值构建其对应的Object,只需扩展它就可以通过一些Default或随机值构建其对应的对象。不要让它来自stringContent的字段值。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可能正在寻找Gson的类型适配器。这些允许您创建custom serialization and deserialization

假设你有以下JSON:

{
  "foo": ...,
  "bar": ...,

  "testInputParam": {
    "startTime": {...},
    "name": "SomeName",
    "num": 1
  },

  "someArray": [...]    
}

例如,您可以编写这样的自定义反序列化器:

private class TestInputParamDeserializer implements JsonDeserializer<TestInputParam> {

  public TestInputParam deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {

    //This is the actual "testInputParam" JSON object...
    JsonObject object = json.getAsJsonObject();

    //This is the custom object you will return...
    TestInputParam result = new TestInputParam();

    //Fill in the "startDate" field with the current Date instead of the actual value in the JSON...
    result.setStartDate = new Date(); 

    //Use the actual "name" found in the JSON...
    result.name = object.get("name").getAsJsonString();

    //Fill in the "num" with a random value...
    result.setNum = new Random().nextInt();

    //Finally return your custom object...
    return result;
  }
}

编写自定义反序列化程序后,只需将其添加到Gson对象:

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(TestInputParam.class, new TestInputParamDeserializer());

现在,每当您使用此gson对象反序列化JSON字符串时,每次找到表示TestInputParam类的JSON对象时,它都将使用自定义反序列化,但您仍然可以使用默认值对JSON字符串的其余部分进行反序列化...


编辑:使用这种方法,您必须为要进行自定义序列化/反序列化的每个类编写自定义序列化程序/反序列化程序。还有一个名为TypeAdapterFactory的类,它允许您为一组相关类型创建类型适配器。您可以找到信息和示例on Gson API documentation