maa*_*nus 12 java adapter gson
AFAIK可以通过最灵活的gson定制TypeAdapterFactory,但它可能会变得不必要地复杂化.它迫使我写的每个处理类既read和write,而真正需要的,有时只有一个方法.此外,有时a JsonSerializer和/或JsonDeserializer更容易编写,例如像这里.这引出了我这些问题:
TypeAdapter它只是代表它的方法一种(如写作ImmutableList,以书面List)?JsonSerializer和/或JsonDeserializer与TypeAdapterFactory?一起使用?或者,他们有工厂吗?Jes*_*son 17
可以创建一个TypeAdapter委托其方法之一.这个用例是API的一个重要部分,并且有一个getDelegateAdapter()方法就是为了这个目的.通过this作为第一个参数getDelegateAdapter将返回,目前出厂后优先适配器.
TypeAdapterFactory immutableListFactory = new TypeAdapterFactory() {
@Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!(type.getType() instanceof ParameterizedType)
|| !type.getRawType().equals(ImmutableList.class)) {
return null;
}
ParameterizedType parameterizedType = (ParameterizedType) type.getType();
TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
TypeAdapter<?> elementAdapter = gson.getAdapter(
TypeToken.get(parameterizedType.getActualTypeArguments()[0]));
return new ImmutableListAdapter(delegate, elementAdapter);
}
class ImmutableListAdapter<E> extends TypeAdapter<ImmutableList<E>> {
private TypeAdapter<List<E>> delegate;
private TypeAdapter<E> element;
ImmutableListAdapter(TypeAdapter<List<E>> delegate, TypeAdapter<E> element) {
this.delegate = delegate;
this.element = element;
}
@Override public void write(JsonWriter out, ImmutableList<E> value) throws IOException {
delegate.write(out, value);
}
@Override public ImmutableList<E> read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
ImmutableList.Builder<E> builder = ImmutableList.builder();
in.beginArray();
while (in.hasNext()) {
builder.add(element.read(in));
}
in.endArray();
return builder.build();
}
}
};
Run Code Online (Sandbox Code Playgroud)
你可以混合和匹配JsonSerializer/ JsonDeserializer用TypeAdapterFactory,但不直接.最简单的方法是回调Gson以序列化类中的子值.在这个例子中,我们将内部循环更改为:
while (in.hasNext()) {
builder.add(gson.<E>fromJson(in, elementType));
}
Run Code Online (Sandbox Code Playgroud)
JsonSerializer/ JsonDeserializer和之间的主要区别TypeAdapter是从JSON到对象模型需要多少个阶段.使用JsonSerializer/ JsonDeserializerobjects首先转换为Gson的DOM模型(JsonElement等),然后转换为对象模型.使用TypeAdapter,跳过中间步骤.
这使得类型适配器代码的读写变得有点棘手,因此您应该只选择优化代码.
| 归档时间: |
|
| 查看次数: |
3829 次 |
| 最近记录: |