【问题标题】:Writing a serializer for Gson using Java 8使用 Java 8 为 Gson 编写序列化程序
【发布时间】:2015-05-25 18:32:44
【问题描述】:

我有一个名为 MyDate 的自己的类,并想为 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());
    }
});

但是我想使用 Java 8 的强大功能,因此尝试了

builder.registerTypeAdapter(MyDate.class, (date, typeOfSrc, context) ->new JsonPrimitive(date.toString()));

但这里 eclipse 告诉我

这个表达式的目标类型必须是函数式接口

Java 8 代码有什么问题?

【问题讨论】:

  • 您确定使用 Java 8 进行编译吗? builder.registerTypeAdapter(MyDate.class, (JsonSerializer&lt;MyDate&gt;) (date, typeOfSrc, context) -&gt; new JsonPrimitive(date.toString())); 为我工作
  • @AlexisC。由于演员阵容(也是另一种解决方案),这很有效。
  • @Radiodef 我这么说是因为 OP 不应该有这个错误消息。使用 javac,我得到incompatible types: Object is not a functional interface。这是有道理的,所以可能是 ECJ 消息有点误导(这不会让我感到惊讶);-)... 目标类型确实不是功能接口,但 javac 在那里更精确。
  • ...但没关系。我的第一条评论有点愚蠢,如果 OP 有这个错误消息,那么他显然是在用 Java 8 编译:D

标签: java json serialization gson java-8


【解决方案1】:

为了用 lambda 替换匿名类,参数必须是 单一方法接口 (SMI)。

这是一个interface,带有单个abstract 方法

GsonBuilder.registerTypeAdaperObject 作为第二个参数。

您需要先分配您的 lambda,然后传入方法:

final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());

builder.registerTypeAdapter(MyDate.class, serializer);

这样你告诉编译器你想实现哪个 SMI。

【讨论】:

  • 谢谢。第一行末尾缺少一个分号。我不允许做这么小的修改。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2023-03-23
相关资源
最近更新 更多