【问题标题】:Parsing error when converting a string to JSONObject将字符串转换为 JSONObject 时解析错误
【发布时间】:2012-12-27 13:03:00
【问题描述】:

我正在制作一个 android 应用程序,这是它抛出的第一个错误:

Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

这是我的类函数:

package com.ernest.httppost;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET method
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }          

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        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();
            json = sb.toString();
        } 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;

    }
}

我认为它会在最后一个 try-catch 块中的 jObj = new JSONObject(json); 返回该错误。任何想法如何解决这个问题?

【问题讨论】:

  • Java 是一种编程语言。 Eclipse 是一个 IDE(集成开发环境)。
  • 我认为你用来构造 JSONObject 的字符串应该是一个有效的 json 字符串。由于错误状态值 &lt;br 无法转换,我猜您正在尝试从 HTML 字符串构造一个 json 对象。确保您传递的是格式正确的 json 字符串。例如:"{\"name\":\"John Ernest Guadalupe\", \"reputation\":181, \"messages\":[\"msg 1\",\"msg 2\",\"msg 3\"]}"
  • @Jules 你应该写一个答案
  • @Ondra 我不认为 android 标签是相关的,即使它是一个 Android 应用程序。
  • 对……我把这个习惯自动化的太多了。

标签: java json xmlhttprequest


【解决方案1】:

评论提升为回答:

我认为您用来构造 JSONObject 的字符串应该是有效的 json 字符串。由于错误状态值 &lt;br 无法转换,我猜您正在尝试从 HTML 字符串构造一个 json 对象。确保您传递的是格式正确的 json 字符串。例如:

"{\"name\":\"John Ernest Guadalupe\", \"reputation\":181, \"messages\":[\"msg 1\",\"msg 2\",\"msg 3\"]}" 

就像 davnicwil 所说:问题可能是由于 URL 不只是返回格式正确的 JSON 字符串。

【讨论】:

  • @John json字符串应该由url指定的页面生成。您能与我们分享您使用的网址吗? (或者如果是本地 url,则只是输出)
  • 那些是本地资源(在您的本地网络上),所以我无法从这里查看它们。您能否访问浏览器中的任何页面,然后查看源代码并将源代码粘贴到此处?最好用输出更新你的答案。
  • 其实是php函数。我将如何查看结果?我不太了解 Eclipse 的方法
  • 只需转到您的网络浏览器中的网址。 (firefox、chrome、internet explorer、safari 等)。然后右键单击页面并单击查看页面源。您将看到生成的 html。这是 php 函数生成的内容,也是将用于传递给 JSONObject 的内容。所以重要的是它看起来像一个有效的 Json 字符串,而不是一些 html 代码(很可能是这种情况。)如果你不知道如何编写 PHP,那么恐怕你会迷失在这个项目,因为 PHP 将为您的 json 对象生成字符串。
【解决方案2】:

看起来您对&lt;br 的响应不是 JSON,因此预计会出现此解析错误。

您是否在请求中使用正确的有效负载访问了正确的 URL?尝试调试以查看您正在请求什么以及响应是什么 - 错误可能很明显。

【讨论】:

  • &lt;br 绝对不是有效的 JSON
  • 我确定网址是正确的,但我不知道您所说的有效载荷是什么意思。如何将其格式化为 JSONobject 字符串或其他内容?
  • 我的意思是请求的参数键/值对 - 它是 POST 请求中的有效负载,或者只是编码在 GET 的 URL 中。您的代码已经将params 放入请求中,问题是,它们是否正确?例如,它们会产生您需要的 JSON 响应吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2020-04-15
  • 2017-04-14
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多