Ich versuche, eine JSON-Zeichenfolge wie diese zu analysieren
[
{
"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"
}
]
in eine Liste von Objekten.
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);
Hier ist eine Objektklasse, die ich verwende.
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;
}
}
Aber es wirft mich mit
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
Irgendwelche Ideen, wie ich das beheben soll?
jstring
Aussehen aus, auf das du in deinem Code angespielt hast?Antworten:
Das Problem ist, dass Sie erzählen
Gson
Sie ein Objekt Ihres Typs haben. Das tust du nicht. Sie haben eine Reihe von Objekten Ihres Typs. Sie können nicht einfach versuchen, das Ergebnis so zu wirken und erwarten, dass es magisch funktioniert;)Das Benutzerhandbuch für
Gson
Erklärt, wie Sie damit umgehen:https://github.com/google/gson/blob/master/UserGuide.md
Das wird funktionieren:
Aber das ist besser:
quelle
TypoToken<Collection<Something>>
- Verwenden Sie keine Arrays, wenn Sie Collection (Unterklassen) und / oder Iterables haben können.Das Problem ist, dass Sie nach einem Objekt vom Typ fragen,
ChannelSearchEnum
aber was Sie tatsächlich haben, ist ein Objekt vom TypList<ChannelSearchEnum>
.Sie können dies erreichen mit:
quelle
Type
ist das? was importieren?java.lang.reflect.Type
In meinem Fall JSON-Zeichenfolge:
und ich drucke "Kategorie" und "url_title" in recycleview
Datum.class
RequestInterface
DataAdapter
und schließlich MainActivity.java
quelle
Alternative könnte sein
damit Ihre Antwort so aussieht
myCustom_JSONResponse
anstatt
server_JSONResponse
CODE
Danach wird es einfach jeder andere sein
GSON Parsing
quelle
Laut GSON-Benutzerhandbuch können Sie dies nicht.
quelle
Gson
sich gerne befassen wirdDies sieht aus wie eine Json-Array-Liste. Daher ist es am besten,
ArrayList
die Daten zu verarbeiten. Fügen Sie in Ihrem API-Endpunkt eine Array-Liste wie diese hinzuquelle
Sie müssen Gson den folgenden zusätzlichen Typ Ihrer Antwort mitteilen
quelle
Ich bin nicht sicher, ob dies der beste Weg ist, GSON zu verwenden, aber es funktioniert für mich. Sie können einige davon verwenden auf
MainActivity
:Sie haben nur Strings, aber wenn Sie Doubles oder Int hätten, könnten Sie
getDouble
oder setzengetInt
auch.Die Methode der
IOHelper
Klasse ist die nächste (hier wird der Pfad im internen Speicher gespeichert):Wenn Sie weitere Informationen dazu wünschen, können Sie dieses Video sehen , in dem ich den Code von erhalte
readJson()
. und dieser Thread, in dem ich den Code von bekommegetData()
.quelle
Kotlin:
quelle