Comment analyser la liste des objets JSON entouré par [] à l'aide de Rénovation et de GSON?
J'ai créé un simple point de terminaison REST:
http://<server_address>:3000/sizes
Cette URL renvoie une réponse très simple contenant un tableau json comme suit:
[
{ "id": 1, "name": "Small", "active": true },
{ "id": 2, "name": "Medium", "active": true },
{ "id": 3, "name": "Large", "active": true }
]
Maintenant, je suis en train de consommer cette réponse à l'aide de Rénovation 2 avec GSON.
J'ai ajouté un modèle:
@lombok.AllArgsConstructor
@lombok.EqualsAndHashCode
@lombok.ToString
public class Size {
private int id;
private String name;
private boolean active;
@SerializedName("created_at")
private String createdAt;
@SerializedName("updated_at")
private String updatedAt;
}
Et de service:
public interface Service {
@GET("sizes")
Call<List<Size>> loadSizes();
}
J'ai instancié un Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://<server_address>:3000")
.addConverterFactory(GsonConverterFactory.create())
.build();
Et mon service:
Service service = retrofit.create(Service.class);
Maintenant, essayez d'appeler les données:
service.loadSizes().enqueue(new Callback<List<Size>>() {
@Override
public void onResponse(Call<List<Size>> call, Response<List<Size>> response) {
for(Size size: response.body()) {
System.out.println(size.toString());
}
}
@Override
public void onFailure(Call<List<Size>> call, Throwable t) {
System.out.println(t.getMessage());
}
});
Ce qui finit avec une exception:
java.lang.IllegalStateException: Devrait BEGIN_OBJECT mais a CHAÎNE à la ligne 1 de la colonne 18 chemin de $[0].nom
Je suppose que l'erreur est causée par le REST API renvoie une réponse qui est un tableau, ni objet.
- Suis-je la corriger?
- Quelle est la meilleure façon de faire que ce code fonctionne?
RESTE le service ne peut pas être modifié, de sorte que la réponse doit rester comme il est.
Aussi, de la désérialisation de la ci-dessus json à l'aide de pure GSON peut être fait par:
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);
Mais je n'ai aucune idée de comment faire Rénover 2 pour l'utiliser.
Merci d'avance.
- Avez-vous essayé sans
lombok
annotations? Peut-être qu'ils sont en quelque sorte faire GSON pensent que le nom est un objet, pas une chaîne de caractères? - Oui, j'ai essayé. Pas de changement, même erreur.
Vous devez vous connecter pour publier un commentaire.
Récemment je viens de terminer un projet lié à la retrofit2. Basé sur ma source, je copie tous vos trucs dans mon projet d'essayer, de faire quelques modifications mineures, il fonctionne bien de mon côté.
Dans votre construction.gradle, ajouter:
Modèle: (mise à JOUR: Suivez tommus cas, createdAt et updatedAt est maintenant indiqué dans sa réponse json de l'échantillon, ces deux valeurs doivent annotation en raison du nom du modèle est différent de json respone)
Service: (Exactement le même que ce que vous avez)
RestClient: (- je ajouter pour ouvrir une session, de sorte que vous pouvez voir toutes les demande d'info et d'intervention info, attention à ne pas utiliser Localhost mais l'adresse ip du serveur dans l'URL )
Sur votre activité, ajouter cette fonction à exécuter votre code: (exactement le même que ce que vous avez fait. La réponse sera à votre liste de taille)
L'exécution de cette, vous verrez les informations que vous souhaitez imprimer:
Voici mon dépôt github que j'utilise retrofit2.0 faire simple OBTENIR des POSTES de SUPPRIMER le travail. Vous pouvez l'utiliser comme référence. Mon Github retrofit2.0 repo
Veuillez utiliser les informations suivantes:
construire.gradle fichier:
WebAPIService.java:
Size.java:
MainActivity.java:
Voici la capture d'écran de débogage:
Mise à JOUR:
Vous pouvez également utiliser l'option suivante:
et
Le plus drôle, le fait est... Mon code est parfaitement bien. Au moins celui présenté dans la question ci-dessus.
J'ai fini la suppression d'une ligne de mon
Size
modèle.Que je me suis concentré sur le code lui-même (notamment de Rénovation de la configuration) j'ai totalement ignoré les importations.
Il s'est avéré -, tandis que la mise en œuvre de
Size
modèle quand j'ai commencé à taperString
classe pour le modèle de champs:name
createdAt
updatedAt
IntelliJ IDEA de complétion de code m'a suggéré
java.lang.String
com.sun.org.apache.xpath.internal.operations.String
ce totalement foiré
Gson
's de la désérialisation.Quand il s'agit de récompenses...
J'ai décidé de marquer comme valide ma propre réponse. Pourquoi?
Un grand merci va à gentlmen ci-dessus pour leurs grands services.
Que je n'ai qu'un bounty j'ai décidé de récompenser les xiaoyaoworm comme son code de mieux correspondre à mes besoins (je n'ai pas écrit il dans ma question, mais l'idée de la rédaction d'un tel service simple - comme je l'ai présenté dans ma question: est - ce pour cacher de l'utilisateur final détails de mise en œuvre et de ne pas utiliser
JsonArray
et tel comme dans BNK réponse).Mise à jour 1:
Le seul problème avec xiaoyaoworm's réponse est que, il a suggéré que le
Size
modèle n'ont pas besoin de toutes les annotations ce qui est totalement faux pour la cité JSON exemple.Pour les cas ci-dessus, exacte deux champs de la
Size
modèle besoins des annotations -created_at
etupdated_at
.J'ai même testé plusieurs versions de la
converter-gson
de la bibliothèque (j'ai vu xiaoyaoworm ont utilisé d'autres que moi) - il n'a pas changé quoi que ce soit. Les Annotations ont été nécessaires.Autrement - encore une fois, merci beaucoup!