“BEGIN_OBJECT atteso, ma era STRING alla riga 1 colonna 1”

Ho questo metodo:

public static Object parseStringToObject(String json) { String Object = json; Gson gson = new Gson(); Object objects = gson.fromJson(object, Object.class); parseConfigFromObjectToString(object); return objects; } 

E voglio analizzare un JSON con:

 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(); } } 

Ma ricevo un messaggio di errore:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT ma era STRING alla riga 1 colonna 1

Anche senza vedere la stringa JSON, dal messaggio di errore è ansible rilevare che non è la struttura corretta ad essere analizzata in un’istanza della class.

Gson si aspetta che la stringa JSON inizi con una parentesi di apertura di oggetti. per esempio

 { 

Ma la stringa che hai passato inizia con delle virgolette aperte

 " 

Il JSON non valido dal server dovrebbe sempre essere un caso d’uso previsto. Un milione di cose possono andare storte durante la trasmissione. Gson è un po ‘complicato, perché il suo output di errore ti darà un problema, e l’effettiva eccezione che otterrai sarà di un tipo diverso.

Con tutto questo in mente, la correzione corretta sul lato client è

 try { gson.fromJSON(ad, Ad.class); //... } catch (IllegalStateException | JsonSyntaxException exception) { //... 

Se vuoi sapere perché il JSON che hai ricevuto dal server è sbagliato, puoi guardare all’interno del blocco catch ad eccezione. Ma anche se è un tuo problema, non è responsabilità del cliente correggere JSON che sta ricevendo da internet.

In ogni caso, è responsabilità del cliente decidere cosa fare quando il JSON diventa cattivo. Due possibilità stanno rigettando il JSON e non facendo nulla, e riprovando.

Se hai intenzione di riprovare, consiglio vivamente di impostare un flag all’interno del blocco try / catch e quindi di rispondere a questo flag al di fuori del blocco try / catch. Probabilmente, il tentativo / cattura annidato è il modo in cui Gson ci ha messo in questo pasticcio con la nostra traccia dello stack e le eccezioni non corrispondenti.

In altre parole, anche se ammetto che non sembra molto elegante, lo consiglierei

 boolean failed = false; try { gson.fromJSON(ad, Ad.class); //... } catch (IllegalStateException | JsonSyntaxException exception) { failed = true; //... } if (failed) { //... 

Forse il tuo JSON Object ragione, ma la risposta che hai ricevuto non è i tuoi dati validi. Proprio come quando connetti il WiFi non valido, potresti ricevere una strana risposta < html>.....< /html> che GSON non può analizzare.

potrebbe essere necessario fare qualche try..catch.. per questa strana risposta per evitare crash.

In Retrofit2, quando vuoi inviare i tuoi parametri in raw devi usare Scalars.

per prima cosa aggiungi questo nel tuo gradle:

 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 getUser(@Body String body); 

}

 public class SampleActivity extends AppCompatActivity implements Callback { @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 userCall = apiInterface.getUser(paramObject.toString()); userCall.enqueue(this); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onResponse(Call call, Response response) { } @Override public void onFailure(Call call, Throwable t) { } 

}

Riferimento: [ Come POST intero grezzo JSON nel corpo di una richiesta di aggiornamento?

Non utilizzare jsonObject.toString su un object JSON.

Assicurati di avere oggetti DESERIALIZZATI come DATE / DATETIME ecc. Se stai inviando direttamente oggetti senza deserializzarli, può causare questo problema.

Sono venuto per condividere una soluzione. L’errore mi è successo dopo aver forzato il notbook a riagganciare. ansible soluzione clean preject .

Nel mio caso, I’m Returning JSON Object as

{“dati”: “”, “messaggio”: “Presenza salvata correttamente .. !!!”, “stato”: “successo”}

Risolto cambiandolo come

{“data”: {}, “messaggio”: “Presenza salvata con successo .. !!!”, “stato”: “successo”}

Qui i dati sono sotto JsonObject e dovrebbero partire da {not “”