Ich habe diese Methode:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Und ich möchte einen JSON analysieren mit:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Aber ich bekomme eine Fehlermeldung:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartet BEGIN_OBJECT, aber STRING in Zeile 1, Spalte 1
Antworten:
Auch ohne Ihre JSON-Zeichenfolge zu sehen, können Sie anhand der Fehlermeldung erkennen, dass es nicht die richtige Struktur ist, um in eine Instanz Ihrer Klasse analysiert zu werden.
Gson erwartet, dass Ihre JSON-Zeichenfolge mit einer Klammer zum Öffnen von Objekten beginnt. z.B
Die Zeichenfolge, die Sie übergeben haben, beginnt jedoch mit offenen Anführungszeichen
quelle
parseStringToObject
schlägt vor, ein JSON-Objekt zu erwarten, das immer mit beginnt{
.{"ip":"192.167.1.15"}
vonRestful EJB web service with jboss EAP 7.1
im Backend. Ich erhalte jedoch "Erwartetes BEGIN_OBJECT, war aber STRING in Zeile 1, Spalte 1". Bitte helfen Sie mir ... Dies ist mein Webdienst: @Stateless @Path ("/ getflashcard") öffentliche Klasse GetFlashcard {@Interceptors (Validator.class) @GET @Produces (MediaType.APPLICATION_JSON) public String getFlashcard () {String jsonString = new JSONObject (). Put ("ip", "192.167.1.15"). ToString (); return jsonString; }}Ungültiger JSON vom Server sollte immer ein erwarteter Anwendungsfall sein. Eine Million Dinge können während der Übertragung schief gehen. Gson ist etwas knifflig, da die Fehlerausgabe Ihnen ein Problem bereitet und die tatsächliche Ausnahme, die Sie abfangen, von einem anderen Typ ist.
In Anbetracht dessen ist die richtige Lösung auf der Client-Seite
Wenn Sie wissen möchten, warum der vom Server empfangene JSON falsch ist, können Sie sich die Ausnahme in Ihrem catch-Block ansehen. Aber selbst wenn es Ihr Problem ist, liegt es nicht in der Verantwortung des Kunden, JSON zu reparieren, das er aus dem Internet empfängt.
In jedem Fall liegt es in der Verantwortung des Kunden, zu entscheiden, was zu tun ist, wenn JSON fehlerhaft wird. Zwei Möglichkeiten sind, den JSON abzulehnen, nichts zu tun und es erneut zu versuchen.
Wenn Sie es erneut versuchen möchten, empfehle ich dringend, ein Flag innerhalb des Try / Catch-Blocks zu setzen und dann auf dieses Flag außerhalb des Try / Catch-Blocks zu reagieren. Verschachtelter Versuch / Fang ist wahrscheinlich, wie Gson uns in dieses Chaos mit unserer Stapelverfolgung und Ausnahmen gebracht hat, die nicht übereinstimmen.
Mit anderen Worten, obwohl ich zugeben werde, dass es nicht sehr elegant aussieht, würde ich empfehlen
quelle
Wenn Sie in Retrofit2 Ihre Parameter in RAW senden möchten, müssen Sie Skalare verwenden.
füge dies zuerst in dein gradle ein:
meine SampleActivity:
Referenz: [ Wie kann ich den gesamten JSON im Hauptteil einer Nachrüstanforderung POSTEN?
quelle
Vielleicht haben Sie
JSON Object
Recht, aber die Antwort, die Sie erhalten haben, sind nicht Ihre gültigen Daten. Genau wie beim Verbinden des Ungültigen erhaltenWiFi
Sie möglicherweise eine seltsame Antwort< html>.....< /html>
,GSON
die nicht analysiert werden kann.Möglicherweise müssen Sie einige
try..catch..
Maßnahmen für diese seltsame Reaktion ergreifen, um einen Absturz zu vermeiden.quelle
Ich bin gekommen, um eine Lösung zu teilen. Der Fehler ist mir passiert, nachdem ich das Notbook zum Auflegen gezwungen habe. mögliche Lösung
clean preject
.quelle
Stellen Sie sicher, dass Sie DESERIALISIERTE Objekte wie DATE / DATETIME usw. haben. Wenn Sie JSON direkt senden, ohne es zu deserialisieren, kann dies zu diesem Problem führen.
quelle
In meiner Situation habe ich ein "Modell", das aus mehreren String-Parametern besteht, mit einer Ausnahme: Es ist ein Byte-Array
byte[]
. Einige Codefragmente:Die letzte Zeile oben ist, wenn die
wird ausgelöst. Beim Durchsuchen des SO wurde mir klar, dass ich eine Form haben muss
Adapter
, um meinBaseModel
JsonObject hin und her zu konvertieren. Das Mischen vonString
undbyte[]
in einem Modell macht die Sache komplizierter. AnscheinendGson
mag die Situation nicht wirklich.Am Ende mache ich ein,
Adapter
um sicherzustellen, dassbyte[]
es in dasBase64
Format konvertiert wird . Hier ist meineAdapter
Klasse:Um JSONObject in ein Modell zu konvertieren, habe ich Folgendes verwendet:
Um das Modell in JSONObject zu konvertieren, habe ich Folgendes verwendet:
Was der Code tut, ist im Grunde, die beabsichtigte
class/object
(in diesem Fallbyte[]
Klasse) durch die zu schieben ,Adapter
wann immer sie während der Konvertierung zu / von JSONObject angetroffen wird.quelle
Nicht
jsonObject.toString
für ein JSON-Objekt verwenden.quelle
In meinem Fall gebe ich JSON-Objekt als zurück
Gelöst durch Ändern als
Hier sind Daten ein Sub-JsonObject und sollten von {not "" ausgehen.
quelle
Wenn Ihr JSON-Format und Ihre Variablen in Ordnung sind, überprüfen Sie Ihre Datenbankabfragen. Selbst wenn die Daten korrekt in der Datenbank gespeichert sind, liegt möglicherweise das eigentliche Problem darin. Überprüfen Sie Ihre Abfragen erneut und versuchen Sie es erneut. Ich hoffe, es hilft
quelle
Vergessen Sie nicht, Ihr Objekt zuerst mit Gson () in Json zu konvertieren.
Dann können Sie es mit dieser fantastischen Bibliothek ganz einfach wieder in ein Objekt konvertieren
quelle