将GsonBuilder转换为Kotlin

10

有人知道如何将这段代码转换为 Kotlin 吗?

GsonBuilder builder = new GsonBuilder();
builder.setLenient();
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            if (json.getAsJsonPrimitive().isNumber()) {
                return new Date(json.getAsJsonPrimitive().getAsLong() * 1000);
            } else {
                return null;
            }
        }
    });
return builder.create();

然后,我尝试了

val builder = GsonBuilder()
builder.setLenient()
builder.registerTypeAdapter(Date::class.java,.........)
return builder.create()

......我无法弄清楚如何将代码转换


你遇到了什么错误? - iagreen
3个回答

13

您所询问的代码行可以转换为以下 Kotlin 代码:

builder.registerTypeAdapter(Date::class.java, JsonDeserializer<Date> { 
    json, typeOfT, context ->
    if (json.getAsJsonPrimitive().isNumber())
        Date(json.asJsonPrimitive.asLong * 1000) else
        null
})

首先,Kotlin支持将lambda转换为Java接口的SAM转换,但其语法与Java不同。然后,在lambda内部使用的返回与Java中有不同的含义,应该用隐式返回标签返回代替。

0

谢谢,我已经弄明白了...这是正确的做法吗?有没有专家可以评论一下

    @Provides
    @Singleton
    fun provideGson(): Gson? {
        val builder = GsonBuilder()
        builder.setLenient()
        builder.registerTypeAdapter(Date::class.java, JsonDeserializer<Date> { json, typeOfT, context ->
            if (json.asJsonPrimitive.isNumber) {
                Date(json.asJsonPrimitive.asLong * 1000)
            } else {
                null
            }
        })
        return builder.create()
    }

0
val gson = GsonBuilder().apply {
        setLenient()
        registerTypeAdapter(Date::class.java,
                JsonDeserializer<Date> { json, typeOfT, context ->
                    if(json.asJsonPrimitive.isNumber) {
                        Date(json.asJsonPrimitive.asLong * 1000)
                    } else {
                        null
                    }
                })
    }.create()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接