【问题标题】:JSON parsing in android: No value for x errorandroid中的JSON解析:x错误没有值
【发布时间】:2012-06-08 10:22:38
【问题描述】:

这是我在 AsyncTask 中使用的代码

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(url);    
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");

HttpResponse response = httpClient.execute(request);

HttpEntity responseEntity = response.getEntity();

char[] buffer = new char[(int)responseEntity.getContentLength()];
    InputStream stream = responseEntity.getContent();
    InputStreamReader reader = new InputStreamReader(stream);
    reader.read(buffer);
    stream.close();

    result = new String(buffer);
    return result;

这将返回一个字符串结果,并在我的 onPostExecute 方法中尝试解析该输入字符串:

JSONObject vehicle = new JSONObject(new String(result));
makeEdit.setText(vehicle.getString("make"));
plateEdit.setText(vehicle.getString("plate"));
modelEdit.setText(vehicle.getString("model"));
yearEdit.setText(vehicle.getString("year"));

一旦它到达 makeEdit.setText 就会抛出一个错误 - make 没有价值。我对android还是很陌生,所以如果有明显的错误,不要发送死亡威胁。输入文本是以下 JSON 字符串:

{"GetJSONObjectResult":{"make":"Ford","model":"Focus","plate":"XXO123GP","year":2006}}

【问题讨论】:

  • 先获取GetJSONObjectResult再获取内部值。

标签: android json parsing


【解决方案1】:

No value for x error 消息在处理 JSON 时很常见。这通常是由忽略的代码造成的。

通常,当 dong JSON 时,我会首先尝试查看 人类可读 结构。为此,我通常使用JSONViewer

在你的情况下,结构是这样的:

您会看到make 在另一个名为GetJSONObjectResult 的对象中。因此,要获取它,必须先获取容器对象:

JSONObject vehicle = ((JSONObject)new JSONObject(result)).getJSONObject("GetJSONObjectResult");
//a more easy to read
JSONObject container = new JSONObject(result);
JSONObject vehicle = container.getJSONObject("GetJSONObjectResult");

最后使用对象获取make

makeEdit.setText(vehicle.getString("make"));
plateEdit.setText(vehicle.getString("plate"));
modelEdit.setText(vehicle.getString("model"));
yearEdit.setText(vehicle.getString("year"));

【讨论】:

  • +1 快一个 ....但是有查询,为什么 JSONObject(new String(result));为什么不 JSONObject(result); ?
  • @DheereshSingh 你是对的。我只是复制粘贴他的代码并添加我的修复。
  • 我不知道车辆数据被包装在一个容器中 x_x 感谢您的快速回复。
【解决方案2】:

您的 JSON 对象自身包含一个 JSONObject。要访问您的数据,您必须这样做:

vehicle.getJSONObject("GetJSONObjectResult").getString("make");

【讨论】:

  • 谢谢 Jeje,我测试过,这段代码也可以工作。我会 +1 你的答案,但我的代表太低了:(
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
相关资源
最近更新 更多