web-dev-qa-db-fra.com

JSONException: la valeur de type Java.lang.String ne peut pas être convertie en JSONObject

J'ai un fichier JSON contenant 2 tableaux JSON: un tableau pour les itinéraires et un tableau pour les vues.

Un itinéraire doit comporter plusieurs vues vers lesquelles l'utilisateur est dirigé. Malheureusement, je reçois l'erreur:

JSONException: la valeur de type Java.lang.String ne peut pas être convertie en JSONObject

Voici mes variables et le code qui analyse le fichier JSON:

private InputStream is = null;
private String json = "";
private JSONObject jObj = null;

try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    is.close();
    // hier habe ich das JSON-File als String
    json = sb.toString();
    Log.i("JSON Parser", json);
} catch (Exception e) {
    Log.e("Buffer Error", "Error converting result " + e.toString());
}

// try parse the string to a JSON object
try {
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString());
}

// return JSON String
return jObj;
}

Log.i ("analyseur JSON", json); me montre qu'au début de la chaîne générée, il y a un signe étrange: enter image description here

mais l'erreur se passe ici:

try {
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString());
}

04-22 14: 01: 05.043: Analyseur E/JSON (5868): Erreur lors de l'analyse des données org.json.JSONException: Valeur // STRANGE SIGN HERE // de type Java.lang.String ne peut pas être converti en JSONObject

quelqu'un sait-il comment se débarrasser de ces panneaux afin de créer le JSONObject?

57
RCK69

voir ceci http://stleary.github.io/JSON-Java/org/json/JSONObject.html#JSONObject-Java.lang.String-

JSONObject

public JSONObject(Java.lang.String source)
           throws JSONException

Construire un JSONObject à partir d'une chaîne de texte JSON source. C’est le constructeur JSONObject le plus utilisé.

Parameters:
    source - `A string beginning with { (left brace) and ending with } (right brace).` 
Throws:
    JSONException - If there is a syntax error in the source string or a duplicated key.

vous essayez d'utiliser quelque chose comme:

new JSONObject("{your string}")
35
Zaz Gmy

La raison est que certains caractères non recherchés ont été ajoutés lors de la composition de la chaîne. La solution temporaire est

return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));

Mais essayez de supprimer les caractères cachés sur la chaîne source.

38
khaintt

A eu le même problème pendant quelques jours. Trouve enfin une solution. Le serveur PHP a renvoyé des caractères invisibles que vous ne pouviez pas voir dans le journal ou dans System.out.

La solution a donc été que j'ai essayé de sous-chaîne mon json String un par un et lorsque je suis arrivé à sous-chaîne (3), l'erreur a disparu.

BTW. J'ai utilisé le codage UTF-8 des deux côtés. PHP côté: header('Content-type=application/json; charset=utf-8');

Côté Java: BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

Alors essayez la solution un par un 1,2,3,4 ...! J'espère que ça vous aide les gars!

try {
            jObj = new JSONObject(json.substring(3));
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json);
        }
15
MTurPash

Voici la version UTF-8, avec plusieurs traitements d'exception:

static InputStream is = null;
static JSONObject jObj = null;
static String json = null;
static HttpResponse httpResponse = null;

public JSONObject getJSONFromUrl(String url) {
    // Making HTTP request
    try {
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, true);
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient(params);
        HttpGet httpPost = new HttpGet( url);
        httpResponse = httpClient.execute( httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           
    } catch (UnsupportedEncodingException ee) {
        Log.i("UnsupportedEncodingException...", is.toString());
    } catch (ClientProtocolException e) {
        Log.i("ClientProtocolException...", is.toString());
    } catch (IOException e) {
        Log.i("IOException...", is.toString());
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8); //old charset iso-8859-1
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        reader.close();
        json = sb.toString();
        Log.i("StringBuilder...", json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (Exception e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
        try {
            jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
        } catch (Exception e0) {
            Log.e("JSON Parser0", "Error parsing data [" + e0.getMessage()+"] "+json);
            Log.e("JSON Parser0", "Error parsing data " + e0.toString());
            try {
                jObj = new JSONObject(json.substring(1));
            } catch (Exception e1) {
                Log.e("JSON Parser1", "Error parsing data [" + e1.getMessage()+"] "+json);
                Log.e("JSON Parser1", "Error parsing data " + e1.toString());
                try {
                    jObj = new JSONObject(json.substring(2));
                } catch (Exception e2) {
                    Log.e("JSON Parser2", "Error parsing data [" + e2.getMessage()+"] "+json);
                    Log.e("JSON Parser2", "Error parsing data " + e2.toString());
                    try {
                        jObj = new JSONObject(json.substring(3));
                    } catch (Exception e3) {
                        Log.e("JSON Parser3", "Error parsing data [" + e3.getMessage()+"] "+json);
                        Log.e("JSON Parser3", "Error parsing data " + e3.toString());
                    }
                }
            }
        }
    }

    // return JSON String
    return jObj;

}
7
izbrannick

C'est simple (merci Gson)

JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();

https://Gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem

5
Mustafa Ferhan

Je pense que le problème peut être dans le jeu de caractères que vous essayez d'utiliser. Il est probablement préférable d’utiliser UTF-8 au lieu d’iso-8859-1.

Ouvrez également le fichier utilisé pour votre InputStream et assurez-vous qu'aucun caractère spécial n'a été inséré par inadvertance. Parfois, vous devez indiquer spécifiquement à votre éditeur d'afficher des caractères cachés/spéciaux.

4
Nic Raboy

Cela a fonctionné pour moi

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
3
Alex Escobar
return response;

Après cela, obtenez la réponse, nous devons analyser cela par:

JSONObject myObj=new JSONObject(response);

En cas de réponse, les guillemets ne sont pas nécessaires.

3
user4879711

J'ai fait ce changement et maintenant cela fonctionne pour moi.

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
2
Jamal

Dans mon cas, mon application Android utilise Volley pour effectuer un appel POST avec un corps vide à une application API hébergée sur Microsoft Azure.

L'erreur était:

JSONException: Value <p>iisnode of type Java.lang.String cannot be converted to JSONObject

Voici un extrait de la manière dont j'ai construit la requête Volley JSON:

final JSONObject emptyJsonObject = new JSONObject();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, emptyJsonObject, listener, errorListener);

J'ai résolu mon problème en créant le JSONObject avec un objet JSON vide comme suit:

final JSONObject emptyJsonObject = new JSONObject("{}");

Ma solution va dans le sens de cette réponse plus ancienne .

1
Pablo Carbajal

Les 3 caractères au début de votre chaîne json correspondent à Byte Order Mask (BOM), qui est une séquence d'octets permettant d'identifier le fichier en tant que fichier UTF8.

Assurez-vous que le fichier qui envoie le JSON est encodé avec tf8 (no bom) = encoding.

(J'ai eu le même problème, avec l'éditeur TextWrangler. Utilisez enregistrez sous - tf8 (no bom) pour forcer le bon codage .)

J'espère que ça aide.

1
stevenwood

Dans mon cas, le problème venait du fichier php. Cela donnait des caractères indésirables. C'est pourquoi un problème de json parsing s'est produit.

Puis je colle mon php code dans Notepad++ et sélectionne Encode in utf-8 without BOM à partir de l'onglet Encoding et exécute ce code.

Mon problème est parti.

1
Abu Mohammad Rasel

si valeur de la clé est venant comme chaîne et vous voulez le convertir en JSONObject,

Prenez d’abord votre key.value dans une variable String telle que

 String data = yourResponse.yourKey;

puis convertir en JSONArray

JSONObject myObj=new JSONObject(data);
0
Thunder