Estou tentando analisar uma string 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"
}
]
em uma lista de objetos.
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);
Aqui está uma classe de objeto que estou 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;
}
}
Mas isso me joga com
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
Alguma idéia de como devo corrigir isso?
jstring
você se refere ao seu código?Respostas:
O problema é que você está dizendo
Gson
que tem um objeto do seu tipo. Você não Você tem uma matriz de objetos do seu tipo. Você não pode simplesmente tentar transmitir o resultado dessa forma e esperar que funcione magicamente;)O guia do usuário
Gson
explica como lidar com isso:https://github.com/google/gson/blob/master/UserGuide.md
Isso funcionará:
Mas isso é melhor:
fonte
TypoToken<Collection<Something>>
- não use matrizes quando puder ter coleção (subclasses) e / ou iteráveis.O problema é que você está solicitando um objeto do tipo,
ChannelSearchEnum
mas o que você realmente tem é um objeto do tipoList<ChannelSearchEnum>
.Você pode conseguir isso com:
fonte
Type
isso é? o que importar?java.lang.reflect.Type
No meu caso, JSON string:
e imprimo "categoria" e "url_title" na revisão de reciclagem
Datum.class
RequestInterface
DataAdapter
e finalmente MainActivity.java
fonte
Alternativa pode ser
para fazer sua resposta parecer
myCustom_JSONResponse
ao invés de
server_JSONResponse
CÓDIGO
Depois disso, será qualquer outro
GSON Parsing
fonte
de acordo com o Guia do Usuário da GSON , você não pode.
fonte
Gson
serão felizes para lidar comParece uma lista de matrizes Json. Portanto, é melhor usar
ArrayList
para manipular os dados. No ponto final da API, adicione uma lista de matrizes como estafonte
Você precisa informar ao Gson o tipo adicional de sua resposta, conforme abaixo
fonte
Não tenho certeza se essa é a melhor maneira de usar o GSON, mas funciona para mim. Você pode usar alguns como este no
MainActivity
:Você só tem seqüências de caracteres, mas se você tiver duplas ou int, poderá colocar
getDouble
ougetInt
também.O método da
IOHelper
classe é o próximo (aqui, o caminho é salvo no armazenamento interno):Se você quiser mais informações sobre isso, pode ver este vídeo , de onde eu recebo o código
readJson()
; e esta discussão onde eu recebo o código degetData()
.fonte
Kotlin:
fonte