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 eine JSON mit analysieren:
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();
}
}
Ich bekomme aber eine Fehlermeldung:
com.google.gson.JsonSyntaxException: Java.lang.IllegalStateException: Erwartete BEGIN_OBJECT war aber STRING in Zeile 1, Spalte 1
Selbst ohne Ihren JSON-String zu sehen, können Sie der Fehlermeldung entnehmen, dass es sich nicht um die richtige Struktur handelt, die in eine Instanz Ihrer Klasse geparst werden soll.
Gson erwartet, dass Ihre JSON-Zeichenfolge mit einer Klammer für das Öffnen von Objekten beginnt. z.B.
{
Die Zeichenfolge, die Sie übergeben haben, beginnt jedoch mit offenen Anführungszeichen
"
Ungültige JSON vom Server sollte immer ein erwarteter Anwendungsfall sein. Eine Million Dinge können während der Übertragung schief gehen. Gson ist ein bisschen knifflig, weil seine Fehlerausgabe zu einem Problem führt und die tatsächliche Ausnahme, die Sie feststellen, von einem anderen Typ ist.
In Anbetracht dessen ist die richtige Lösung auf der Clientseite
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
Wenn Sie wissen möchten, warum der JSON, den Sie vom Server erhalten haben, falsch ist, können Sie in Ihrem catch-Block die Ausnahme anzeigen. Aber selbst wenn es Ihr Problem ist, liegt es nicht in der Verantwortung des Kunden, den aus dem Internet empfangenen JSON zu beheben.
In jedem Fall liegt es in der Verantwortung des Kunden, zu entscheiden, was zu tun ist, wenn JSON schlecht wird. Es gibt zwei Möglichkeiten, den JSON abzulehnen, nichts zu tun und es erneut zu versuchen.
Wenn Sie es erneut versuchen möchten, empfehle ich Ihnen dringend, ein Flag im Try/Catch-Block zu setzen und dann auf dieses Flag außerhalb des Try/Catch-Blocks zu reagieren. Verschachtelter Try/Catch ist wahrscheinlich, wie Gson uns mit unserer Stack-Ablaufverfolgung und den nicht übereinstimmenden Ausnahmen in dieses Chaos gebracht hat.
Mit anderen Worten, obwohl ich zugeben muss, dass es nicht sehr elegant aussieht, würde ich empfehlen
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
In Retrofit2: Wenn Sie Ihre Parameter in RAW senden möchten, müssen Sie Scalars verwenden.
füge dies zuerst in deinem gradle hinzu:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "[email protected]");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
Referenz: [ How to POST Raw JSON im Hauptteil einer Retrofit-Anforderung?
Ihr JSON Object
ist vielleicht richtig, aber die Antwort, die Sie erhalten haben, ist nicht Ihre gültigen Daten. Wenn Sie beispielsweise die ungültige WiFi
verbinden, erhalten Sie möglicherweise eine ungewöhnliche Antwort < html>.....< /html>
, die GSON
nicht analysieren kann.
möglicherweise müssen Sie für diese seltsame Antwort einen try..catch..
ausführen, um einen Absturz zu vermeiden.
Ich bin gekommen, um eine Lösung zu teilen. Der Fehler ist mir passiert, nachdem das Notbook zum Auflegen gezwungen wurde. mögliche Lösung clean preject
.
In meinem Fall gebe ich JSON-Objekt zurück als
{"data": "", "message": "Teilnahme gespeichert Erfolgreich .. !!!", "Status": "Erfolg"}}
Gelöst durch Ändern als
{"data": {}, "message": "Teilnahme gespeichert Erfolgreich .. !!!", "Status": "Erfolg"}}
Hier ist data ein Sub-JsonObject und es sollte von {nicht "" beginnen.
wenn Ihr Json-Format und Ihre Variablen in Ordnung sind, überprüfen Sie Ihre Datenbankabfragen. Selbst wenn Daten in Db korrekt gespeichert werden, kann das tatsächliche Problem darin liegen
Stellen Sie sicher, dass Sie DESERIALIZED-Objekte wie DATE/DATETIME usw. haben. Wenn Sie JSON direkt senden, ohne es zu deserialisieren, kann dies zu diesem Problem führen.
Verwenden Sie jsonObject.toString
nicht für ein JSON-Objekt.