使用 Java 8 为 Gson 编写序列化程序
Writing a serializer for Gson using Java 8
我有一个名为 MyDate
的 class 并想为 Gson 编写一个序列化程序。此代码有效:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() {
@Override
public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.toString());
}
});
不过我想使用Java8的力量,所以尝试了
builder.registerTypeAdapter(MyDate.class, (date, typeOfSrc, context) ->new JsonPrimitive(date.toString()));
但是这里eclipse告诉我
The target type of this expression must be a functional interface
Java 8 代码有什么问题?
为了用 lambda 替换匿名 class,参数必须是 单一方法接口 (SMI)。
这是一个 interface
和 单一 abstract
方法。
GsonBuilder.registerTypeAdaper
将 Object
作为第二个参数。
您需要先分配您的 lambda,然后传入方法:
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());
builder.registerTypeAdapter(MyDate.class, serializer);
这样你就可以告诉编译器你想实现哪个 SMI。
我有一个名为 MyDate
的 class 并想为 Gson 编写一个序列化程序。此代码有效:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() {
@Override
public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.toString());
}
});
不过我想使用Java8的力量,所以尝试了
builder.registerTypeAdapter(MyDate.class, (date, typeOfSrc, context) ->new JsonPrimitive(date.toString()));
但是这里eclipse告诉我
The target type of this expression must be a functional interface
Java 8 代码有什么问题?
为了用 lambda 替换匿名 class,参数必须是 单一方法接口 (SMI)。
这是一个 interface
和 单一 abstract
方法。
GsonBuilder.registerTypeAdaper
将 Object
作为第二个参数。
您需要先分配您的 lambda,然后传入方法:
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());
builder.registerTypeAdapter(MyDate.class, serializer);
这样你就可以告诉编译器你想实现哪个 SMI。