哔哩哔哩 Json数据解析

  • 最近在做一个个人业余项目 由于这个项目中都是采用的网络上的公开的api接口的数据
  • 这些数据均返回的是json格式的数据,数据不是来自一个网站,格式就千奇百怪了。
  • 其中哔哩哔哩BiliBili这个接口有几个坑爹的地方。
    坑爹的key
  • 这个字段Key是数字,这就不能用Gson,FastJson来解析了。这就需要自己手动解析了。


    type不连续
  • 首先分析这个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里面包含Object和num
  • 然后从集合中取出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; 集合中
  }    }}
解析json的完整代码
  • 上面是我想这个问题的思路,后来简化了一下代码,看起来没什么问题,通过日志分析,在第二个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)); 
           }
       }
    }

如果有大神知道代码的问题所在,请告知,非常感谢。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容