【问题标题】:Android: JSONException when loading data from Rails APIAndroid:从 Rails API 加载数据时出现 JSONException
【发布时间】:2015-03-06 17:50:19
【问题描述】:

我在 Android 应用程序中解析来自 Rails API 的 JSON 响应时遇到问题。 我的 Android 应用程序中有相当标准的 json 解析器。当我用教程中的一些 JSON url 提供它时,它似乎工作得很好(比如这个:http://demo.codeofaninja.com/tutorials/json-example-with-php/index.php. 但是一旦我把我的链接放在那里(我使用隧道到我的本地主机) - 它无法解析任何数据并给出

JSONException: Value of type java.lang.String cannot be converted to JSONObject

所以我相信问题出在我的服务器响应中。在浏览器中的响应看起来像

{
"items": [
    {
        "title": "Sometitle",
        "address": "Someaddress"
    },
    {
        "title": "Sometitle2",
        "address": "Someaddress2"
    }
]
}

和 json 验证器显示它是有效的。我研究了类似的问题并没有找到解决方案,我不知道可能是什么原因。有人可以提出解决方案吗?

UPD。我的实际 Android 代码:

public class JsonParser {

final String TAG = "JsonParser.java";

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

public JSONObject getJSONFromUrl(String url) {

    // make HTTP request
    try {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        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).append("\n");
        }
        is.close();
        json = sb.toString();

    } catch (Exception e) {
        Log.e(TAG, "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e(TAG, "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;
}

}

然后在我的活动中:

          JsonParser jParser = new JsonParser();

          // get json string from url
          JSONObject json = jParser.getJSONFromUrl(ITEMS_URL);

          // get the array of items
          dataJsonArr = new JSONArray(json);

【问题讨论】:

  • 您需要发布您尝试在应用中解析 JSON 的位置的代码。
  • “在浏览器中的响应看起来像...”:是您的 Android 设备上的浏览器还是桌面上的浏览器?
  • @Ascorbin 使用解析器代码更新
  • @Vla :在这种情况下,请再次在桌面浏览器中查看它,然后查看源代码 - 那里可能还有其他内容(例如 HTML 标签等)。
  • @Squonk 实际上它在浏览器中似乎是 html 样式的,但是为什么在线 json-validators 显示来自 url 的 json 是有效的?另一个问题是我在西里尔字母中有一些字符串,这可能是原因吗?我不确定。

标签: android ruby-on-rails json parsing


【解决方案1】:

实际问题是对请求使用 HttpPost,它应该是 HttpGet。

由于服务器端的请求映射,来自 API 的响应可能是错误响应。

【讨论】:

  • 我试过了,但情况还是一样 - 我的 API url 出错,教程中的一个没有错误。我认为这应该是 Url 问题
  • 如果使用 curl,API 的响应是什么?您是否在 Android 代码中使用了正确的方法?获取还是发布?就是想。您可能在浏览器中使用 Postman 进行 POST,但这并不明显。
  • 这是一个简单的 GET 请求。 curl 怎么样 - 这很奇怪:{"items":[{"title":"\u0421\u0432\u0456\u0442\u0430\u043d\u043e\u043a","address":"\u0443\u0440. \u0413\u0440\u044f\u0434\u0430"},{...... Cyrylic 的东西似乎被编码了。这会导致问题吗?
  • 那我想你想要一个 HttpGet,而不是 DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = 新的 HttpPost(url); API 接收到错误的 HttpMethod,您可能会在设备代码中收到错误消息。
  • 好的,这不是西里尔语问题 - 我更改了 API 代码以向我发送虚拟英文数据 - 问题仍然存在。
【解决方案2】:

这可能是服务器端问题,在您从服务器获取响应的方法中,您必须首先在字符串变量中获取响应,尝试从那里获取响应,也许您从那里得到正确的响应..

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多