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?
jstring
aspecto tiene al que aludió en su código?Respuestas:
El problema es que estás diciendo
Gson
que 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
Gson
Explica 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,
ChannelSearchEnum
pero lo que realmente tiene es un objeto de tipoList<ChannelSearchEnum>
.Puede lograr esto con:
fuente
Type
es eso que importarjava.lang.reflect.Type
En 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 Parsing
fuente
según la guía del usuario de GSON , no puede.
fuente
Gson
ocupará felizmenteEsto parece una lista de matriz Json, por lo tanto, es mejor usarlo
ArrayList
para 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
getDouble
ogetInt
también.El método de
IOHelper
clase 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