我有一个带有2个JSON-Arrays的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 Parser”,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 Parser(5868):解析数据时出错 org.json.JSONException:Value // STRANGE SIGN HERE //类型 java.lang.String无法转换为JSONObject
任何人都知道如何摆脱这些迹象以创建JSONObject?
答案 0 :(得分:37)
原因是在撰写String时添加了一些不需要的字符。 临时解决方案是
return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
但是尝试删除源字符串上的隐藏字符。
答案 1 :(得分:33)
看到这个 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}")
答案 2 :(得分:15)
几天有同样的问题。 最后找到解决方案。 PHP服务器返回了一些您在LOG或System.out中看不到的看不见的字符。
所以解决方法是我试图逐个子串起我的json String,当我来到substring(3)时,错误就消失了。
顺便说一句。我在两边都使用了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);
}
答案 3 :(得分:7)
这是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;
}
答案 4 :(得分:5)
这很简单(感谢Gson)
JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();
https://gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem
答案 5 :(得分:4)
我认为问题可能出在您尝试使用的字符集中。最好使用UTF-8而不是iso-8859-1。
同时打开用于InputStream的任何文件,并确保没有意外插入特殊字符。有时您必须专门告诉编辑显示隐藏/特殊字符。
答案 6 :(得分:3)
return response;
之后得到响应我们需要解析它:
JSONObject myObj=new JSONObject(response);
在回复时,不需要双引号。
答案 7 :(得分:3)
这对我有用
json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
答案 8 :(得分:2)
我做了这个改变,现在它适用于我。
//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
答案 9 :(得分:1)
json字符串开头的3个字符对应于字节顺序掩码(BOM),它是一个字节序列,用于将文件标识为UTF8文件。
确保发送json的文件使用 utf8(无bom)编码进行编码。
(我有同样的问题,使用TextWrangler编辑器。使用另存为 - utf8(无bom) 强制进行正确的编码。)
希望它有所帮助。
答案 10 :(得分:1)
在我的情况下,问题发生在php
文件中。
它产生了不需要的字符。这就是发生json parsing
问题的原因。
然后我将php code
粘贴到Notepad++
并选择Encode in utf-8 without BOM
从Encoding
标签并运行此代码 -
我的问题消失了。
答案 11 :(得分:1)
在我的情况下,我的Android应用程序使用Volley与一个空主体进行POST调用,以便在Microsoft Azure上托管的API应用程序。
错误是:
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("{}");
我的解决方案是this older answer。
答案 12 :(得分:0)
如果密钥的值 ,并且您希望将其转换为 JSONObject ,的
首先将key.value转换为像
这样的String变量 String data = yourResponse.yourKey;
然后转换为JSONArray
JSONObject myObj=new JSONObject(data);
答案 13 :(得分:0)
对我来说,我只需要使用 getString()
与getJSONObject()
(后者引发了该错误):
JSONObject jsonObject = new JSONObject(jsonString);
String valueIWanted = jsonObject.getString("access_token"))