0

全部 ,

Gson 给了我很多启发,现在我要扩展 Gson 以构建具有一些自定义默认值的任何其他类型的对象。我应该重写 Gson 的哪一部分?我真的很想重用 Gson 反射和支持的基本类型。但是我在查看 Gson 的源代码后发现,基于当前 Gson 的设计,有一些困难。

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

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

测试输入参数类:

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 值构建其对应的对象,只需扩展它就可以通过一些默认值或随机值构建其对应的对象。不要让它的字段值来自 stringContent 。

4

1 回答 1

0

如果我理解您的问题,您可能正在寻找 Gson 的类型适配器。这些允许您创建自定义序列化和反序列化

假设您有以下 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,允许您为一组相关类型创建类型适配器。您可以在 Gson API 文档中找到信息和示例。

于 2013-10-21T09:01:12.560 回答