全部,
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的字段值。
答案 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。