web-dev-qa-db-fra.com

"BEGIN_OBJECT attendu mais STRING était indiqué à la ligne 1, colonne 1"

J'ai cette méthode:

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

Et je veux analyser un JSON avec:

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

Mais je reçois un message d'erreur:

com.google.gson.JsonSyntaxException: Java.lang.IllegalStateException: BEGIN_OBJECT attendu mais STRING à la ligne 1 colonne 1

66
Crapo Wolf

Même sans voir votre chaîne JSON, vous pouvez voir dans le message d'erreur que ce n'est pas la structure correcte à analyser dans une instance de votre classe.

Gson s'attend à ce que votre chaîne JSON commence par une accolade d'ouverture d'objet. par exemple. 

{

Mais la chaîne que vous avez passée commence par un guillemet ouvert

"
120
bhspencer

Un JSON non valide provenant du serveur doit toujours être un cas d'utilisation attendu. Un million de choses peuvent mal se passer pendant la transmission. Gson est un peu délicat, car sa sortie d'erreur vous posera un problème, et l'exception réelle que vous aurez capturée sera d'un type différent.

Avec tout cela à l'esprit, la solution appropriée du côté client est

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

Si vous voulez savoir pourquoi le fichier JSON que vous avez reçu du serveur est incorrect, vous pouvez regarder à l'intérieur de votre bloc catch à l'exception. Mais même si c'est votre problème, le client n'est pas responsable de la réparation de JSON qu'il reçoit d'Internet.

Dans les deux cas, il incombe au client de décider quoi faire lorsque le fichier JSON devient mauvais. Deux possibilités sont de rejeter le JSON, de ne rien faire et d’essayer à nouveau.

Si vous essayez à nouveau, je vous recommande vivement de définir un indicateur dans le bloc try/catch et de répondre à cet indicateur en dehors du bloc try/catch. C'est probablement la façon dont Gson nous a mis dans le pétrin avec notre trace de pile et les exceptions qui ne correspondent pas.

En d'autres termes, même si j'admets que ça n'a pas l'air très élégant, je le recommanderais

boolean failed = false;

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

if (failed)
{
  //...
10
Jessica Pennell

Dans Retrofit2, lorsque vous souhaitez envoyer vos paramètres bruts, vous devez utiliser Scalars.

ajoutez d'abord ceci dans votre grade:

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) {
}

}

Référence: [ Comment POST] créer un fichier JSON entier dans le corps d'une demande de modification?

3
Raj008

Peut-être que votre JSON Object est correct, mais la réponse que vous avez reçue ne correspond pas à vos données valides. Tout comme lorsque vous connectez la variable WiFi invalide, vous pouvez recevoir une réponse étrange < html>.....< /html> que GSON ne peut pas analyser.

vous devrez peut-être utiliser un try..catch.. pour cette réponse étrange afin d'éviter un crash.

2
BrantYu

Je suis venu pour partager une solution. L'erreur m'est arrivée après avoir forcé le notbook à raccrocher. solution possible clean preject.

0
Wallace Roberto

Dans mon cas, je retourne un objet JSON en tant que 

{"data": "", "message": "Participation sauvegardée Avec succès ... !!!", "status": "succès"}

Résolu en le changeant comme 

{"data": {}, "message": "Participation sauvegardée Avec succès ... !!!", "status": "succès"}

Ici les données sont un sous JsonObject et il devrait commencer à partir de {pas "" 

0

si votre format JSON et vos variables sont corrects, vérifiez vos requêtes de base de données ... même si les données sont correctement enregistrées dans la base de données, le problème peut se trouver là ... vérifiez à nouveau vos requêtes et essayez à nouveau ... J'espère que cela vous aidera

0
Shabbir Ahmed

Assurez-vous que vous avez des objets DÉSERIALISÉS tels que DATE/DATETIME, etc. Si vous envoyez directement un fichier JSON sans le désérialiser, cela peut être la cause de ce problème.

0
Ravi Wadje

N'utilisez pas jsonObject.toString sur un objet JSON.

0