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:
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?
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}")
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.
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);
}
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;
}
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
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.
Cela a fonctionné pour moi
json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
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.
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);
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 .
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.
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.
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);