不能将 java.lang.String 类型的值转换为 JSONObject

我有一个包含2个 JSON 数组的 JSON 文件: 一个数组用于路线,一个数组用于景点。

一条路线应该包括用户导航到的几个景点。 不幸的是,我得到了一个错误:

不能将 java.lang.String 类型的值转换为 JSONObject

下面是我的变量和解析 JSON-File 的代码:

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

I (“ JSON Parser”,JSON) ; 显示在生成的字符串的开头有一个奇怪的符号: < img src = “ https://i.stack.imgur.com/uOiX8.png”alt = “ enter image description here”>

但错误发生在这里:

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

04-2214:01:05.043: E/JSON Parser (5868) : 解析数据时出错 JSONException: Value//STRANGE SIGN HERE//of type 不能将 java.lang.String 转换为 JSONObject

有人知道如何去掉这些符号来创建 JSONObject 吗?

334873 次浏览

看这个 Http://stleary.github.io/json-java/org/json/jsonobject.html#jsonobject-java.lang

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

我认为问题可能出在你正在尝试使用的字符集中。最好使用 UTF-8而不是 iso8859-1。

还要打开 InputStream 所使用的任何文件,并确保没有意外插入特殊字符。有时你必须特别告诉你的编辑器显示隐藏/特殊字符。

好几天都有同样的问题。终于找到解决办法了.PHP 服务器返回了一些在 LOG 或 System.out 中看不到的未知字符。

所以解决方案就是我尝试一个接一个地使用 substring,当我使用 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);
}

原因是在编写 String 时添加了一些不需要的字符。 临时解决方案是

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

但请尝试删除源 String 上的隐藏字符。

下面是 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;


}

Json 字符串开头的3个字符对应于 Byte Order Mask (BOM) ,这是一个字节序列,用于将文件标识为 UTF8文件。

确保发送 json 的文件使用 Utf8(无爆炸)编码。

(我在使用 TextWrangler 编辑器时遇到了同样的问题,使用 另存为-< strong > utf8(无 bom) 强制正确的编码。)

希望能有帮助。

我做了这个改变,现在它对我有效了。

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
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

在我的案例中,问题发生在 php文件中。 它给出了不需要的字符,这就是 json parsing出现问题的原因。

然后我将我的 php code粘贴到 Notepad++并选择 Encode in utf-8 without BOMEncoding选项卡并运行此代码-

我的问题解决了。

这招对我很管用

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));

在我的例子中,我的 Android 应用程序使用 Volley 对微软 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("{}");

我的解决方案是沿着 这个古老的答案的路线。

如果 钥匙的价值就像

首先将 key.value 放入一个 String 变量,如

 String data = yourResponse.yourKey;

然后转换成 JSONArray

JSONObject myObj=new JSONObject(data);

对我来说,我只需要使用 getString()getJSONObject()(后者抛出了这个错误) :

JSONObject jsonObject = new JSONObject(jsonString);
String valueIWanted = jsonObject.getString("access_token"))