J'essaie d'analyser une chaîne JSON comme celle-ci
[
{
"updated_at":"2012-03-02 21:06:01",
"fetched_at":"2012-03-02 21:28:37.728840",
"description":null,
"language":null,
"title":"JOHN",
"url":"http://rus.JOHN.JOHN/rss.php",
"icon_url":null,
"logo_url":null,
"id":"4f4791da203d0c2d76000035",
"modified":"2012-03-02 23:28:58.840076"
},
{
"updated_at":"2012-03-02 14:07:44",
"fetched_at":"2012-03-02 21:28:37.033108",
"description":null,
"language":null,
"title":"PETER",
"url":"http://PETER.PETER.lv/rss.php",
"icon_url":null,
"logo_url":null,
"id":"4f476f61203d0c2d89000253",
"modified":"2012-03-02 23:28:57.928001"
}
]
dans une liste d'objets.
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);
Voici une classe d'objets que j'utilise.
import com.google.gson.annotations.SerializedName;
public class ChannelSearchEnum {
@SerializedName("updated_at")
private String updated_at;
@SerializedName("fetched_at")
private String fetched_at;
@SerializedName("description")
private String description;
@SerializedName("language")
private String language;
@SerializedName("title")
private String title;
@SerializedName("url")
private String url;
@SerializedName("icon_url")
private String icon_url;
@SerializedName("logo_url")
private String logo_url;
@SerializedName("id")
private String id;
@SerializedName("modified")
private String modified;
public final String get_Updated_at() {
return this.updated_at;
}
public final String get_Fetched_at() {
return this.fetched_at;
}
public final String get_Description() {
return this.description;
}
public final String get_Language() {
return this.language;
}
public final String get_Title() {
return this.title;
}
public final String get_Url() {
return this.url;
}
public final String get_Icon_url() {
return this.icon_url;
}
public final String get_Logo_url() {
return this.logo_url;
}
public final String get_Id() {
return this.id;
}
public final String get_Modified() {
return this.modified;
}
}
Mais ça me jette avec
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
Des idées comment dois-je le réparer?
jstring
ressemble votre allusion dans votre code?Réponses:
Le problème est que vous dites
Gson
vous avez un objet de votre type. Non. Vous disposez d'un tableau d'objets de votre type. Vous ne pouvez pas simplement essayer de lancer le résultat comme ça et vous attendre à ce qu'il fonctionne comme par magie;)Le Guide de l'utilisateur pour
Gson
explique comment gérer cela:https://github.com/google/gson/blob/master/UserGuide.md
Cela fonctionnera:
Mais c'est mieux:
la source
TypoToken<Collection<Something>>
- n'utilisez pas de tableaux lorsque vous pouvez avoir Collection (sous-classes) et / ou Iterables.Le problème est que vous demandez un objet de type
ChannelSearchEnum
mais ce que vous avez réellement est un objet de typeList<ChannelSearchEnum>
.Vous pouvez y parvenir avec:
la source
Type
ça? quoi importer?java.lang.reflect.Type
Dans mon cas, la chaîne JSON:
et j'imprime "category" et "url_title" dans recycleview
Datum.class
RequestInterface
DataAdapter
et enfin MainActivity.java
la source
Une alternative pourrait être
pour faire ressembler votre réponse
myCustom_JSONResponse
au lieu de
server_JSONResponse
CODE
Après cela, ce sera tout autre
GSON Parsing
la source
selon le guide de l'utilisateur GSON , vous ne pouvez pas.
la source
Gson
sera heureux de faire faceCela ressemble à une liste de tableaux Json, il est donc préférable de l'utiliser
ArrayList
pour gérer les données. Dans votre point de terminaison api, ajoutez une liste de tableaux comme celle-cila source
Vous devez informer Gson du type supplémentaire de votre réponse comme ci-dessous
la source
Je ne sais pas si c'est la meilleure façon d'utiliser GSON, mais ça marche pour moi. Vous pouvez en utiliser comme ceci sur
MainActivity
:Vous n'avez que des cordes, mais si vous aviez des doubles ou des int, vous pourriez mettre
getDouble
ougetInt
aussi.La méthode de
IOHelper
classe est la suivante (Ici, le chemin est sauvegardé sur le stockage interne):Si vous voulez plus d'informations à ce sujet, vous pouvez voir cette vidéo , où je reçois le code de
readJson()
; et ce fil où je reçois le code degetData()
.la source
Kotlin:
la source