想象一下以下字段:
@JsonAdapter(CustomTypeAdapter.class)
private int field;
当反序列化时,CustomTypeAdapter
的{{1}}方法会照常调用,但在序列化时,{{1完全忽略了方法,并且内置类型按照通常的方式写出。 (如果我使用read
而不是write
,也会发生同样的事情。)
我在the documentation中找不到任何说明这是预期行为的内容。是吗?或者这是一个错误吗?
我能找到的唯一解决方法是创建一个自定义"持有者"输入然后公开,例如,
Integer
这有效,但有点麻烦。
答案 0 :(得分:2)
虽然我同意它不适用于int
,但我无法在Gson 2.3.1中重现 1>}的行为。首先,您必须使用TypeAdapter<Integer>
(或Integer
)而不是TypeAdapterFactory
。它在JsonAdapter
Javadoc中具体说明了。
此注释引用的类必须是
TypeAdapter
或TypeAdapterFactory
。使用工厂界面可以委派给封闭的JsonSerializer
实例。
然后,类型不自动装箱,因此如果要使用注释,则该字段必须为Gson
。在玩具示例中将这两个事实结合起来(同样,Integer
将不起作用),我们有:
int
输出:
import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class JsonAdapterExample {
public static void main(String[] args) {
Gson g = new Gson();
System.out.println(g.toJson(new Car()));
}
public static class Car {
@JsonAdapter(IdAdapter.class)
Integer id = 10;
}
public static class IdAdapter extends TypeAdapter<Integer> {
@Override
public Integer read(JsonReader arg0) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void write(JsonWriter arg0, Integer arg1) throws IOException {
arg0.beginObject();
arg0.name("id");
arg0.value(String.valueOf(arg1));
arg0.endObject();
}
}
}
如果它不起作用,它将是{"id":{"id":"10"}}
而不是10
,并且没有内部对象。