我正在考虑换到Gson。
根据我的初学者知识,我知道有两种方法可以实现自定义序列化程序和反序列化程序:
JsonSerializer
和JsonDeserializer
,以及TypeAdaptor
.
请考虑以下事项:
public class Pojo {
@JsonAdaptor(MyCustomAdaptor.class)
private Integer number;
}
class MyCustomAdaptor extends TypeAdaptor<Integer> {
@Override
public Integer read(JsonReader in) throws IOException {
// ...
}
public void write(JsonWriter writer, Integer value) throws IOException {
// ...
}
}
我注意到TypeAdaptor
没有公开number
的Field
,JsonSerializer
和JsonDeserializer
也不是这样。我知道当这些类在封送/解送生命周期中使用时,没有必要知道这些信息。
现在,让我们假设Field
在TypeAdaptor
中公开。下面是我将执行的基本示例:
public class Pojo {
@JsonAdaptor(MyCustomAdaptor.class)
@FloatSerialize
private Number number;
}
class MyCustomAdaptor extends TypeAdaptor<Number> {
@Override
public Number read(JsonReader in, Field field) throws IOException {
// Do something if @FloatSerialize is present.
}
public void write(JsonWriter writer, Number value, Field field) throws IOException {
// Do something if @FloatSerialize is present.
}
}
- 我知道这没有意义,因为
@JsonAdaptor
可以用于类和字段。*
而且,我知道有更好的方法来完成上面的例子;这只是一个示例,没有任何意义。基本上,我希望使用注解,在每个字段的基础上,告诉自定义的序列化程序/反序列化程序如何处理。
这在Gson中可能吗?你能创建一个自定义的序列化器/反序列化器来公开带注解的类/字段/等等吗?
2条答案
按热度按时间7rtdyuoh1#
您已经为Integer字段添加了注解。
我注意到TypeAdaptor不公开数字字段
我想你误会了什么。
您提供TypeAdaptor,并赋予它与您的字段相同的型别:
public void write(JsonWriter writer, Integer value) throws IOException
然后在序列化时,您将已注解的java对象作为输入序列化为字符串,然后您将字段直接用作参数中的'value':
public void write(JsonWriter writer, Integer value) throws IOException
个在反序列化时,你有一个json字符串作为输入来反序列化到你已经注解的对象。在类型适配器中,这个对象是你的字段,这就是为什么read方法返回一个Integer。
Integer read(JsonReader in) throws IOException
由您决定是否从JsonReader返回Integer。
您可以在字段中使用数字而不是整数,然后您可以在字段中使用浮点型、整数型、短整型和更多类型。
为此,您需要携带一个数字适配器:
如果你真的想考虑“场”,那么就为整个对象提供一个适配器:
然后,您可以访问整个对象及其在适配器中的字段。
与JsonSerializer/JsonDeserialize相同。
vs91vp4v2#
使用您的其他信息:
这是我凭记忆写的但你已经明白了