JSONException:类型java.lang.String的值不能转换为JSONObject
我有一个JSON文件,其中有2个JSON数组:一个数组的路线和一个数组的景点。
一条路线应该由用户可以导航到的几个景点组成。 不幸的是我得到的错误:
JSONException:类型java.lang.String的值不能转换为JSONObject
这里是我的变量和解析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(“JSON解析器”,json); 告诉我,在生成的字符串的开头有一个奇怪的标志:
但错误发生在这里:
try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); }
04-22 14:01:05.043:E / JSON解析器(5868):解析数据时出错org.json.JSONException:// // STRANGE SIGN HERE // //类型java.lang.String无法转换为JSONObject
任何人都有一个线索,如何摆脱这些迹象,以创建JSONObject?
看到这个http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-
的JSONObject
public JSONObject(java.lang.String source) throws JSONException
从源JSON文本字符串构造JSONObject。 这是最常用的`JSONObject构造函数。
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.
你尝试使用一些东西,如:
new JSONObject("{your string}")
原因是在撰写字符串时添加了一些不想要的字符。 临时解决方案是
return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
但是尝试删除源字符串上的隐藏字符。
几天以来都有同样的问题。 终于找到了解决办法 。 PHP服务器返回了一些看不见的字符,在LOG或System.out中看不到。
所以解决的办法是,我试图substring我的json字符串一个一个,当我来到子字符串(3)错误消失。
BTW。 我在两边都使用了UTF-8编码。 PHP方面: header('Content-type=application/json; charset=utf-8');
JAVA端: BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
所以一个一个尝试解决方案1,2,3,4 …! 希望它可以帮助你们!
try { jObj = new JSONObject(json.substring(3)); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json); }
这里是UTF-8版本,有几个异常处理:
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; }
我认为这个问题可能在你正在尝试使用的字符集中。 最好使用UTF-8而不是iso-8859-1。
同时打开任何文件正在使用您的InputStream,并确保没有特殊字符被意外插入。 有时你必须特别告诉你的编辑器显示隐藏/特殊字符。
return response;
之后得到我们需要解析这个答复:
JSONObject myObj=new JSONObject(response);
答复时不需要双引号。
这是简单的方法(谢谢Gson)
JsonParser parser = new JsonParser(); String retVal = parser.parse(param).getAsString();
https://gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem
这对我有效
json = json.replace("\\\"","'"); JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
我做了这个改变,现在它适用于我。
//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
json字符串开始处的3个字符对应于字节顺序掩码(Byte Order Mask,BOM),字节顺序掩码(Byte Order Mask,BOM)是字节序列,用于将文件标识为UTF8文件。
确保发送json的文件使用utf8(no bom)编码进行编码。
(我有与TextWrangler编辑器相同的问题,使用另存为 – utf8(无bom)强制正确的编码。)
希望它有帮助。
在我的情况下,问题发生在php
文件。 它给了不需要的字符。这就是为什么发生json parsing
问题。
然后,我将我的php code
粘贴到Notepad++
然后Encode in utf-8 without BOM
Encoding
选项卡中选择Encode in utf-8 without BOM
的Encoding
然后运行这个代码 –
我的问题消失了。
就我而言,我的Android应用程序使用Volley将托管在Microsoft Azure上的API应用程序与空的主体进行POST调用。
错误是:
JSONException: Value <p>iisnode of type java.lang.String cannot be converted to JSONObject
这是我如何构建Volley JSON请求的一个片段:
final JSONObject emptyJsonObject = new JSONObject(); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, emptyJsonObject, listener, errorListener);
我解决了我的问题,通过创建一个空的JSON对象的JSONObject
,如下所示:
final JSONObject emptyJsonObject = new JSONObject("{}");
我的解决方案是沿着这个旧的答案 。