it-swarm.com.de

"Erwartete BEGIN_OBJECT war aber STRING in Zeile 1, Spalte 1"

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

66
Crapo Wolf

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

"
120
bhspencer

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)
{
  //...
10
Jessica Pennell

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?

3
Raj008

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.

2
BrantYu

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.

0
Wallace Roberto

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

0
Shabbir Ahmed

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.

0
Ravi Wadje

Verwenden Sie jsonObject.toString nicht für ein JSON-Objekt.

0