Kotlin

2017-05-18 9 views
6

にGsonBuilderを変換し、誰もがその後kotlinに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() 

を試してみましたコード

+0

どのようなエラーが表示されますか? – iagreen

答えて

8

次Kotlinコードに変換することができますについて尋ねているコードの行:

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

まず、KotlinはSAM conversion of lambdas to Java interfacesをサポートしていますが、構文は、Javaとは異なっています。次に、lambdaの内部の戻り値はJavaの場合とは異なる意味を持ち、implicit returnsまたはlabeled returnsに置き換える必要があります。

+0

おかげでmike .. tq .. – ZeroOne

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()