- 最近在做一个个人业余项目 由于这个项目中都是采用的网络上的公开的api接口的数据
- 这些数据均返回的是json格式的数据,数据不是来自一个网站,格式就千奇百怪了。
- 其中哔哩哔哩BiliBili这个接口有几个坑爹的地方。
-
这个字段Key是数字,这就不能用Gson,FastJson来解析了。这就需要自己手动解析了。
- 首先分析这个Json字符串,type的编号不是连续的,这里可以用迭代器根据key的值来遍历出value的值,然后将值存入List<String>中去
JSONObject root = new JSONObject(json);
Iterator<String> rootKeys = root.keys();
while (rootKeys.hasNext()) {
String next = rootKeys.next();
mTypeList.add(root.getString(next));} //将type类型剥离出来存放到字符串集合mTypeList中
- 然后从集合中取出type的value剥离出0,1这些条目数,这里忽略了num这个字段,因为num的层次和item是同一个层次
for (int i = 0; i < mTypeList.size(); i++) {
JSONObject type = new JSONObject(mTypeList.get(i));
Iterator<String> typeKeys = type.keys();
while (typeKeys.hasNext()) {
String next = typeKeys.next();
if (type.getString(next).startsWith("{")) {
BiliBiliModel model = JsonUtils.fromJson(type.getString(next), BiliBiliModel.class); //将item转化成Model实体
mModelList.add(model); //将model存入List<BiliBiliModel> mModelList; 集合中
} }}
- 上面是我想这个问题的思路,后来简化了一下代码,看起来没什么问题,通过日志分析,在第二个while循环里面就只能加载一条数据,真是见鬼。
以下是错误代码、以下是错误代码、以下是错误代码 重要的问题拷贝三遍。
JSONObject root = new JSONObject(json);
Iterator<String> rootKeys = root.keys();
while (rootKeys.hasNext()) {
String next = rootKeys.next();
JSONObject type = new JSONObject(root.getString(next));
Iterator<String> typeKeys = type.keys();
while (typeKeys.hasNext()) {
String typeNext = typeKeys.next();
if (type.getString(typeNext).startsWith("{")) {
mModelList.add(JsonUtils.fromJson(type.getString(next), BiliBiliModel.class));
}
}
}
如果有大神知道代码的问题所在,请告知,非常感谢。
- JsonUtils.fromJson 这个方法在我自己整理的一个工具类库中
https://github.com/h4de5ing/AndroidCommon - 使用方法,最新版请看参考
compile 'com.code19.library:library:0.0.6'
以上完整代码参考
https://github.com/h4de5ing/read/blob/master/app/src/main/java/com/code19/read/model/BiliBiliBiz.java
https://github.com/h4de5ing/read/blob/master/app/src/main/java/com/code19/read/domain/BiliBiliModel.java
- 你以为你就成功解析所有的数据了,太尼玛天真了,看图
- BiliBiliModel这个model是用GsonFormat生成的,所以生成的play字段是int型,可是解析到这一条的是个字符串,程序立马就崩溃了,修改成String型就可以了。
总结:
- 最初打开的这个接口的时候,没有细看第一想法是用Gson解析,把json字符串复制到GsonFormat中的时候报data err错误,才发现有0这种字段
- 手动解析常用的几个类是JSONObject、JSONArray、JSONTokener这些类,网络上一大把介绍用这几个类来手动解析json的,但是不适用哔哩哔哩这里的大量数据,而且字段名称、字段类型可变的情况。
参考:
https://github.com/h4de5ing/read
https://github.com/h4de5ing/AndroidCommon