android使用JSON遇到的坑(1)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android使用JSON遇到的坑(1)相关的知识,希望对你有一定的参考价值。
参考技术A 最近在开发的过程中遇到一个问题,服务端返回了一个JSON对象,在用JSON库解析的时候出现了一个诡异的问题服务端返回的原始JSON是
在程序中直接调用JSON中的方法
打印的日志如下
通过JSON的方法取到的结果出现了不一致的情况。应该是转换的时候精度出现了损失,一步一步跟到内部的实现方法,先看optLong()
这里调用了两个参数的optLong()方法,在不传默认值的时候如果出错的话这个方法会返回0。再往里跟,这个方法内部调用了JSON.toLong()方法。
接着向里面走
看来问题是出在这里了,当输入的参数为String的时候,toLong()方法会使用Double.parseDouble()方法解析,而我们知道double的精度是会有损失的,在 Google的文档 上有这么一句话
在取非常大的数字的时候,会先转换成String,再通过parseDouble()方法转成long,这期间就造成了精度损失。
先得到String类型的值,再将String转成long
这样就可以正确的取到值了,Long.valueOf()内部实现调用了BigInteger中的方法,这样就能保证结果正确了。
Android -- 使用OKhttp获取response时遇到的坑
最近在使用OKhttp请求服务器数据的时候,发现打印的时候显示数据正常,但是在传递到解析函数的时候发生错误:
运行到response.body().string()一步时抛异常,java.lang.IllegalStateException: closed;或者是在
JSON.parseObject(response.body().string(),ChampionListBean.class);
提示以下错误:可以看到,我Log出来的数据是正常的,但是解析的时候总是不正常。
因为是第一次使用这个OKhttp,所以总是提示没有数据,困扰了大半天。
看看我的代码:
try
URL url = new URL(path);
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if(response.isSuccessful())
Log.i("getResponse",response.body().string());<span style="white-space:pre"> //埋下的坑
ChampionListBean championListBean = JSON.parseObject(response.body().string(),ChampionListBean.class);<span style="white-space:pre"> //跳进的坑
parseList(championListBean);
/*Message message = new Message();
message.obj = response.body().string();
message.what = 3;
handler.sendMessage(message);*/
else
throw new IOException("Unexpected code " + response);
catch (MalformedURLException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
上面的代码里面,运行起来就是如上的效果,打印出来的数据是正常,但是到了解析这里就出现问题了。提示没有数据,
com.alibaba.fastjson.JSONException: syntax error, expect , actual error, pos 0!
还有一种情况就是提示数据流被关闭了:java.lang.IllegalStateException: closed ;
两个原因都是The IllegalStateException
arises because the HttpConnection seems to be closed when trying to use it. Could it be because you are calling twice the method response.body()
?就是说调用response.body().string()的时候数据流已经关闭了,再次调用就是提示已经closed,或者没有数据送到解析处。
我们在调试的时候喜欢Log一下看看数据正不正常,我在使用HttpURLConnection 或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析,没有出现这样的问题;但是在使用OKhttp时就不正常了,因为调用了一次response.body().string(),那么这个流就已经被关闭了。所以想要Log,又要解析的时候,解决的办法是
暂存一下这个数据:String tempResponse = response.body().string();然后使用这个暂存的数据tempResponse 。
验证:一切正常了:
希望能帮到类似问题的朋友。
参考帖子: http://www.cnblogs.com/boann/p/5479201.html
以上是关于android使用JSON遇到的坑(1)的主要内容,如果未能解决你的问题,请参考以下文章