Estoy tratando de analizar una cadena JSON como esta
[
{
"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"
}
]
en una lista de objetos.
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);
Aquí hay una clase de objeto que estoy usando.
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;
}
}
Pero me arroja con
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
¿Alguna idea de cómo debería solucionarlo?

jstringaspecto tiene al que aludió en su código?Respuestas:
El problema es que estás diciendo
Gsonque tienes un objeto de tu tipo. Usted no Tienes una gran variedad de objetos de tu tipo. No puedes simplemente tratar de emitir el resultado así y esperar que funcione mágicamente;)La Guía del usuario de
GsonExplica cómo lidiar con esto:https://github.com/google/gson/blob/master/UserGuide.md
Esto funcionará:
Pero esto es mejor:
fuente
TypoToken<Collection<Something>>- no use matrices cuando puede tener Colección (subclases) y / o Iterables.El problema es que está pidiendo un objeto de tipo,
ChannelSearchEnumpero lo que realmente tiene es un objeto de tipoList<ChannelSearchEnum>.Puede lograr esto con:
fuente
Typees eso que importarjava.lang.reflect.TypeEn mi caso, la cadena JSON:
e imprimo "category" y "url_title" en recycleview
Datum.class
RequestInterface
Adaptador de datos
y finalmente MainActivity.java
fuente
La alternativa podría ser
para que su respuesta se vea como
myCustom_JSONResponse
en vez de
server_JSONResponse
CÓDIGO
Después de esto, será cualquier otro
GSON Parsingfuente
según la guía del usuario de GSON , no puede.
fuente
Gsonocupará felizmenteEsto parece una lista de matriz Json, por lo tanto, es mejor usarlo
ArrayListpara manejar los datos. En su punto final de la API, agregue una lista de matriz como estafuente
Debe informar a Gson el tipo adicional de su respuesta como se muestra a continuación
fuente
No estoy seguro de si esta es la mejor manera de usar GSON, pero funciona para mí. Puede usar algunos como este en
MainActivity:Es suficiente con cuerdas, pero si usted tendría dobles o int, se puede poner
getDoubleogetInttambién.El método de
IOHelperclase es el siguiente (aquí, la ruta se guarda en el almacenamiento interno):Si desea más información sobre esto, puede ver este video , donde obtengo el código de
readJson(); y este hilo donde obtengo el código degetData().fuente
Kotlin:
fuente