- 最近在做一個個人業余項目 由于這個項目中都是采用的網絡上的公開的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));
}
}
}
如果有大神知道代碼的問題所在,請告知,非常感謝。
- 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