2017-10-02 3 views
3

Utilisation de gson et retrofit et création d'un JsonDeserializer.Argument de type non reconnu dans Kotlin

En Java, la classe est définie comme:

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

Dans Kotlin, il est défini comme:

class NavigationMenuArrayDeserializer : JsonDeserializer<Array<NavigationMenu>> {... 

La classe java est appelé comme prévu après avoir été enregistré auprès GSON. La classe Kotlin n'est jamais appelée.

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); 
} 

Toute idée pourquoi?

+0

Avez-vous enregistré il, comme le montre 'JavaDoc': https://static.javadoc.io/com.google .code.gson/gson/2.6.2/com/google/gson/JsonDeserializer.html – guenhter

+0

Pouvez-vous nous montrer le code dans lequel vous utilisez ce désérialiseur? –

+0

J'hésite parce que la compagnie pour laquelle je travaille peut avoir des problèmes avec ça. Je vais vous dire que la classe n'est jamais appelée, donc aucun code ne s'exécute. Quand j'ai changé le kotlin en java, ça s'est bien passé. C'est quelque chose dans le tableau Kotlin vs l'objet java [] mais je ne peux pas dire avec certitude – Psest328

Répondre

1

Malheureusement, aucune suggestion n'a fonctionné pour moi. J'ai converti la classe appelante de java en kotlin en appelant les types de classe java en kotlin qui a facilement fonctionné pour moi dans le passé ... et cela a fait l'affaire.

Ma première tentative d'appel de la classe de tableau kotlin à partir d'une classe java n'a toujours pas abouti, mais j'ai réussi à faire fonctionner la configuration, donc j'appelle cela complet.

Conversion de la configuration du code Java dans l'OP à Kotlin a fait l'affaire:

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

Quelle est la magie avec la nouvelle configuration? – EpicPandaForce

+0

vient de poster le code. pas de magie, juste faire le "convertir en kotlin" a corrigé le problème – Psest328

0

J'ai résolu un problème similaire en utilisant la classe array. Essayez quelque chose comme ceci:

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

J'espère que cela pourrait aider.

0

Vous pouvez essayer d'utiliser TypeToken comme ceci.

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); 
}