【问题标题】:JSONException: Value of type java.lang.String cannot be converted to JSONObjectJSONException:java.lang.String 类型的值无法转换为 JSONObject
【发布时间】:2012-05-03 07:39:09
【问题描述】:

我有一个包含 2 个 JSON 数组的 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): 解析数据时出错 org.json.JSONException: Value //STRANGE SIGN HERE // 类型 java.lang.String 无法转换为 JSONObject

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

【问题讨论】:

    标签: android json parsing


    【解决方案1】:

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

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

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

    【讨论】:

    • 和我合作得很好!谢谢,我只需要抛出异常。
    • 它可以工作,但它有点黑客!!。解决此问题的正确方法是什么??
    • @user1232726 让后端工作以提供良好的 json 格式; )
    【解决方案2】:

    看到这个 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}")
    

    【讨论】:

    • thx,我的 JSON 文件以左大括号 { 开始,以右大括号 } 结束。我使用这个 JSON-validator 来确保 JSON-Syntax 是正确的。问题是,我从 JSON 生成的字符串前面有一个奇怪的符号,你可以在这里看到:i.stack.imgur.com/uOiX8.png
    • 我有同样的问题,在某些“成功”的情况下,我的应用程序由于这个问题的相同错误而兑现。但在另一种“成功”模式下它可以正常工作。关键是在大多数情况下它是否有效,所以我很困惑。
    【解决方案3】:

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

    所以解决方案是我尝试将我的 json 字符串逐个子串化,当我来到 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);
            }
    

    【讨论】:

    • 我喜欢你的解决方案 :) 我遇到了同样的问题,我用你的解决方案解决了它。无论我如何更改文档的字符集,其中仍然存在一些不可见的字符。感谢您的解决方案:)
    • 我也有同样的问题,但看不出创建子字符串会如何解决这个问题?
    • 要决定在子字符串中使用的值,只需在调试模式下运行您的应用程序并复制 JSONObject 中使用的值。将其粘贴到 Notepad++ 中,您将看到导致 JSON 失败的字符。无需多次尝试。
    • 我发现了我的问题。 php上有一些不需要的回声:(但我提高了你的答案,因为它很明智;)
    【解决方案4】:

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

    【讨论】:

    • 部分方法已弃用
    • 取决于您使用的 API ;)
    【解决方案5】:

    这对我有用

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

    【讨论】:

      【解决方案6】:

      这个方法很简单(感谢 Gson)

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:
          return response;
          

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

          JSONObject myObj=new JSONObject(response);
          

          响应时不需要双引号。

          【讨论】:

            【解决方案9】:

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

            //BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
            

            【讨论】:

              【解决方案10】:

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

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

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

              希望对您有所帮助。

              【讨论】:

                【解决方案11】:

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

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

                我的问题消失了。

                【讨论】:

                • 我做了和你提到的一样的事情,但仍然得到同样的错误:org.json.JSONException: Value Server of type java.lang.String cannot be converted to JSONObject。如何查找我的 php 文件是否返回警告?实际上它返回正确的JSON,没有不正确或隐藏的字符。
                • @blueware before json_encode 您可以看到您的数据使用 print_r() 打印它。黑色的字符?标记的是罪魁祸首。从您的数据中删除这些,然后编码将起作用
                【解决方案12】:

                在我的例子中,我的 Android 应用使用 Volley 向托管在 Microsoft Azure 上的 API 应用发出一个空主体的 POST 调用。

                错误是:

                JSONException: Value <p>iisnode of type java.lang.String cannot be converted to JSONObject
                

                这是关于我如何构建 Volley JSON 请求的 sn-p:

                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

                【讨论】:

                • 我只是将方法从 GET 更改为 POST 并像您所做的那样发送一个空对象,它对我有用。谢谢
                【解决方案13】:

                如果 Key 的值 String 并且您想将其转换为 JSONObject,

                首先将您的 key.value 放入一个字符串变量中,例如

                 String data = yourResponse.yourKey;
                

                然后转换成 JSONArray

                JSONObject myObj=new JSONObject(data);
                

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-12-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多