[英]Can Gson's custom serializers and deserializers get the class/field?
我正在考虑切换到 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 这可能吗? 您可以创建一个自定义序列化器/反序列化器来公开带注释的类/字段/等吗?
@JsonAdaptor(MyCustomAdaptor.class)
private Integer number;
您已注释 Integer 字段。
我注意到 TypeAdaptor 没有公开数字的字段
我认为你误解了一些东西。
你提供 TypeAdaptor,你给它与你的字段相同的类型:
class MyCustomAdaptor extends TypeAdaptor<Integer>
然后在序列化时,您将 java 对象注释为输入以序列化为字符串,然后您的字段可直接用作参数中的“值”:
public void write(JsonWriter writer, Integer value) throws IOException
在反序列化时,您有一个 json 字符串作为输入以反序列化到您已注释的 object。 在类型适配器中,这个 object 是您的字段,这就是 read 方法返回 Integer 的原因。
Integer read(JsonReader in) throws IOException
从 JsonReader 返回 Integer 由您决定。
您可以在您的字段中使用数字而不是 Integer,然后您可以在您的字段中使用浮点数、integer 等。
为此,您需要带一个 NumberAdaptor:
class MyCustomAdaptor extends TypeAdaptor<Number> {
Number read(JsonReader in, Field field) throws IOException;
void write(JsonWriter writer, Number value) throws IOException;
}
如果您真的想考虑“字段”,请为整个对象提供一个适配器:
class Pojo Adaptor extends TypeAdaptor< Pojo > {
Pojo read(JsonReader in) throws IOException;
void write(JsonWriter writer, Pojo value) throws IOException;
}
然后您可以访问整个 object 及其在适配器中的字段。
与 JsonSerializer/JsonDeserialize 相同。
使用您的附加信息:
class Pojo Adaptor extends TypeAdaptor< Pojo > {
Pojo read(JsonReader in) throws IOException{
for(Field f: Pojo.class.getDeclaredFields()){
f.steAccessible();
for(Annotation a : f.getAnnotations()){
// Do what you want here withe the field and its annotation
}
}
void write(JsonWriter writer, Pojo value) throws IOException{
for(Field f: Pojo.class.getDeclaredFields()){
f.steAccessible();
for(Annotation a : f.getAnnotations()){
// Do what you want here with the field and its annotation
}
}
}
}
我是从我的 memory 写的,但你明白了
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.