69

我有一个 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 Parser(5868): Error parsering data org.json.JSONException: Value //STRANGE SIGN HERE // of type java.lang.String 无法转换为 JSONObject

有人知道如何摆脱这些标志以创建 JSONObject 吗?

4

14 回答 14

47

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

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

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

于 2013-03-18T04:45:53.503 回答
41

看到这个 http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-

JSON对象

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}")
于 2012-04-22T12:41:46.570 回答
20

有几天同样的问题。终于找到了解决办法。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);
        }
于 2012-07-31T06:51:12.057 回答
9

这是 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;

}
于 2013-04-24T14:15:00.880 回答
9

这对我有用

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
于 2015-09-07T03:23:33.837 回答
7

这是简单的方法(感谢 Gson)

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

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

于 2015-05-22T11:06:00.170 回答
5

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

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

于 2012-04-23T22:45:48.450 回答
4
return response;

之后得到我们需要解析的响应:

JSONObject myObj=new JSONObject(response);

响应时不需要双引号。

于 2015-05-08T16:07:20.263 回答
3

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

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
于 2013-12-03T10:41:25.467 回答
2

json 字符串开头的 3 个字符对应于字节顺序掩码 (BOM),它是一个字节序列,用于将文件标识为 UTF8 文件。

确保发送 json 的文件使用utf8(无 bom)编码。

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

希望能帮助到你。

于 2013-07-16T09:19:28.460 回答
2

就我而言,问题来自php文件。它给出了不需要的字符。这就是出现json parsing问题的原因。

然后我粘贴我php codeNotepad++Encode in utf-8 without BOMEncoding选项卡中选择并运行此代码-

我的问题消失了。

于 2015-07-14T05:49:31.760 回答
2

在我的例子中,我的 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);

我通过创建JSONObject一个空的 JSON 对象来解决我的问题,如下所示:

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

我的解决方案与这个较旧的答案一致

于 2016-10-24T18:15:56.077 回答
1

如果Key 的值以String的形式出现, 并且您想将其转换为JSONObject

首先将您的 key.value 放入 String 变量中,例如

 String data = yourResponse.yourKey;

然后转换成 JSONArray

JSONObject myObj=new JSONObject(data);
于 2018-02-07T12:27:30.117 回答
1

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

JSONObject jsonObject = new JSONObject(jsonString);
String valueIWanted = jsonObject.getString("access_token"))
于 2020-09-09T22:20:22.160 回答