我使用JSONObject forecast = new JSONObject(response.body(。。string())来获取天气信息,但是android监视器总是显示“org.json.JSONException:输入结束于字符0”。< / p>
$(document).ready(function(){
$("#controls").click(function(){
$("#hiddenSideBar").animate({left: '0px'});
})
});
我使用Log.d(TAG,response.body()。string())来测试它是一个字符串,但是当在JSONObject中预测= new JSONObject(response.body()。string())时,它不行。
答案 0 :(得分:7)
答案:响应对象应为通用类型 - ResponseBody
。
请参阅下面的更正代码以供参考。
现在response.body()
方法将返回对象ResponseBody
即
ResponseBody rb = response.body();
rb.string();
此处ResponseBody的方法string()
返回String
个对象,但内部string()
方法调用Util.closeQuietly(source);
,一旦调用方法string()
,响应就为空。
只需删除Log.d(TAG, response.body().string());
并按照以下代码操作即可。
参考 - okhttp3.ResponseBody.java
错误: org.json.JSONException:字符0的输入结束
正确的代码:
@Override
public void onResponse(Call call, Response<ResponseBody> response) throws IOException {
if (response.isSuccessful()) {
String remoteResponse=response.body().string();
Log.d(TAG, remoteResponse);
try {
JSONObject forecast = new JSONObject(remoteResponse);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:5)
出于某种奇怪的原因,如果您使用.string()
&gt; 1次,则回复结果为空。在解析Retrofit响应时,尝试仅使用一次。
有人知道为什么会这样,请改进我的答案。
答案 2 :(得分:1)
有时候问题出在URL上,如果您的网站强制使用 HTTPS ,则必须确保您在 HTTPS URL 中使用了您的APP,反之亦然,如果您的网站不支持 HTTPS ,则必须使用 HTTP URL 。
答案 3 :(得分:0)
我在“if(response.isSuccessful())”之前移动“String a = response.body()。string()”之后解决了这个问题。