嗶哩嗶哩 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容