Próbuję przeanalizować ciąg JSON taki jak ten
[
{
"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"
}
]
na listę obiektów.
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);
Oto klasa obiektów, której używam.
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;
}
}
Ale to mnie rzuca
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
Wszelkie pomysły, jak to naprawić?
jstring
wyglądasz, o którym wspomniałeś w kodzie?Odpowiedzi:
Problem polega na tym,
Gson
że mówisz, że masz obiekt tego typu. Ty nie. Masz tablicę obiektów swojego typu. Nie możesz tak po prostu rzucić takiego wyniku i oczekiwać, że zadziała magicznie;)Podręcznik użytkownika
Gson
wyjaśnia, jak sobie z tym poradzić:https://github.com/google/gson/blob/master/UserGuide.md
To zadziała:
Ale to jest lepsze:
źródło
TypoToken<Collection<Something>>
- nie używaj tablic, gdy możesz mieć kolekcję (podklasy) i / lub Iterables.Problem polega na tym, że pytasz o obiekt typu,
ChannelSearchEnum
ale tak naprawdę masz obiekt typuList<ChannelSearchEnum>
.Możesz to osiągnąć za pomocą:
źródło
Type
jest? co zaimportować?java.lang.reflect.Type
W moim przypadku ciąg JSON:
i w widoku kosza wypisuję „kategorię” i „url_title”
Datum.class
RequestInterface
DataAdapter
i wreszcie MainActivity.java
źródło
Alternatywą może być
aby Twoja odpowiedź wyglądała
myCustom_JSONResponse
zamiast
server_JSONResponse
KOD
Po tym będzie już tylko każdy inny
GSON Parsing
źródło
zgodnie z instrukcją obsługi GSON nie możesz.
źródło
Gson
chętnie sobie z tym poradziWygląda to jak lista tablic Jsona, dlatego najlepiej wykorzystać ją
ArrayList
do obsługi danych. W punkcie końcowym interfejsu API dodaj taką listę tablicźródło
Musisz powiadomić Gson o dodatkowym typie odpowiedzi, jak poniżej
źródło
Nie jestem pewien, czy jest to najlepszy sposób korzystania z GSON, ale działa dla mnie. Możesz użyć czegoś takiego na
MainActivity
:Masz tylko łańcuchy, ale jeśli miałbyś dublet lub int, możesz umieścić
getDouble
lubgetInt
też.IOHelper
Następna jest metoda klasy (tutaj ścieżka jest zapisywana w pamięci wewnętrznej):Jeśli chcesz uzyskać więcej informacji na ten temat, możesz zobaczyć ten film , skąd otrzymam kod
readJson()
; i ten wątek, w którym otrzymuję kodgetData()
.źródło
Kotlin:
źródło