2017-10-02 14 views
3

gsonとretrofitを使用してJsonDeserializerを作成しました。 Javaで型引数がKotlinで認識されない

、クラスは次のように定義される。Kotlinで

public class Test implements JsonDeserializer<NavigationMenu[]> {... 

、それは次のように定義される。

GSONに登録された後に、期待どおり
class NavigationMenuArrayDeserializer : JsonDeserializer<Array<NavigationMenu>> {... 

Javaクラスが呼び出されます。 Kotlinクラスは呼び出されません。

Retrofit jsonClient = new Retrofit 
       .Builder() 
       .baseUrl(baseUrl) 
       .client(okHttpClient) 
       .addConverterFactory(getGsonConverter()) 
       .build(); 

...

private GsonConverterFactory getGsonConverter() { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.setLenient(); 
    gsonBuilder.registerTypeAdapter(NavigationMenu[].class, new NavigationMenuArrayDeserializer()); 
    Gson gson = gsonBuilder.create(); 
    return GsonConverterFactory.create(gson); 
} 

任意のアイデアなぜですか?

+0

あなたは、それを登録している:https://static.javadoc.io/com.google .code.gson/gson/2.6.2/com/google/gson/JsonDeserializer.html – guenhter

+0

このデシリアライザを使用しているコードを表示できますか? –

+0

私が働いている会社に問題があるかもしれないので、私は躊躇しています。クラスが呼び出されることはないので、コードは実行されません。 kotlinをJavaに切り替えると、うまくいきました。それはkotlin配列の何かです対Javaオブジェクト[]しかし、私は確かに言うことはできません – Psest328

答えて

1

残念ながら、私の提案はありませんでした。私はkotlinのJavaクラスの型を呼び出すと、以前は簡単に私のために働いていました...そして、それはトリックでした。

Javaクラスからkotlin配列クラスを呼び出す私の元の試みはまだ失敗しましたが、私はこれを完全に呼び出すように構成を動作させることができました。 KotlinにOPで設定Javaコードの変換

はトリックをした: `JavaDoc`がそれを示しているよう

private val gsonConverter: GsonConverterFactory 
    get() { 
     val gsonBuilder = GsonBuilder() 
     gsonBuilder.setLenient() 
     gsonBuilder.registerTypeAdapter(Array<NavigationMenu>::class.java, NavigationMenuArrayDeserializer()) 
     val gson = gsonBuilder.create() 
     return GsonConverterFactory.create(gson) 
    } 
+0

新しい設定の魔法は何ですか? – EpicPandaForce

+0

がコードを投稿しました。マジックなし、単に "kotlinに変換"して問題を解決しました – Psest328

0

私は配列クラスを使用して同様の問題を解決しました。

val clazz = (Array<NavigationMenu>::class).java 
gson.fromJson(json, clazz) 

これが役に立ちそうですか?

0

このようにTypeTokenを試してみてください。

private GsonConverterFactory getGsonConverter() { 

    val type = object : TypeToken< ArrayList <NavigationMenu>>(){}.getType() 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.setLenient(); 

    gsonBuilder.registerTypeAdapter(type, new NavigationMenuArrayDeserializer()); 

    Gson gson = gsonBuilder.create(); 
    return GsonConverterFactory.create(gson); 
} 
関連する問題