手动解析json的惨痛经历

想必安卓开发这边一般都是通过json来传输数据,然后通过gson 或者 fastjson来解析json串,通常是没啥问题的。。。然而还有特殊情况,下面就来讲讲特殊情况吧。

 "datalist": [
            {
                "id": 1,
                "sortindex": "111",
                "type": "cartoon",
                "details": {
                    "id": 1,
                    "title": "xxxx",
                    "summary": "xxxx",
                    "imageurl": "xxxx",
                    "url": "http://m.kk-me.com/article/1.html"
                }
            },
            {
                "id": 1,
                "sortindex": "111",
                "type": "article",
                "details": {
                    "id": 1,
                    "title": "xxxx",
                    "imageurl": [
                        "xxx",
                        "xxxx"
                    ],
                    "url": "http://m.kk-me.com/article/1.html",
                    "needpay": 1
                }
            }
]

请注意里面的type字段,这个是根据业务场景来的,就是一个列表里面有
cartoon类型的也有article类型的。里面有一个关键的字段imageurl,没错就是他,在上一个类型的时候是字符串类型 但是下一个类型的时候就成了数组类型。

看到这里你也许会想让后台改改字段不就行了,然并卵,后台说基于扩展1张图片的时候就是字符串,展示3张图片的时候就是数组了,合情合理不修改。。。无奈啊,前端的悲哀,人家这样反得只能这样解析了。

因为用习惯了三方解析,自然不愿意手动解析啊,人都是有惰性的嘛,再说项目比较急,开始准备解析方案:

  1. 在gson里面的bean里面设置一个通用列表条目的bean,将imageurl设为Object类型,到时候再强制转换。
    事实证明这个方案不可行,三方解析的时候必须明确定义字段的确切数据类型

2.因为在列表里面只有imageurl这个字段有可能为数组类型,那就先拿到数据返回的字符转进行解析,先将"[ ]"这两个字符替换为 "" 将其变为字符串类型,到时候再通过","符号进行切割在取值,总之就是不愿手动解析
这个方案一开始感觉不错,但是操作下来就出问题了。首先,忽略了datalist 这个字段跟的数组类型,要替换的时候也会把这个符号给替换掉,要找需要修改的数组符号不好判定 。 其次,这个列表是首页返回的数据,json串挺大的,遍历替换的话对性能也有影响。最后,不易扩展,有可能以后别的添加的字段也是数组的类型,到时候你还得再去判定一遍

3.最后考量再三只能用手动解析了。。。。

先手动创建一个通用的bean对象,解析的时候将数据存入

public class DatalistBean {   
public long id;    
public String sortindex;    
public String type;    
public DynamicItemBean details;
public class DynamicItemBean {   
  public long id;    
  public String title;    
  public String imageurl;   
  public String url;    
  public ArrayList<String> imagearray;   //此字段代表imageurl为数组情形
    ....其他的字段此处省略
}
}

然后进行解析:

try {
//obj为上文解析出来的JSONObject对象,这边就不再展示了
JSONArray datalist_array = obj.getJSONArray("datalist");
for (int i = 0; i < datalist_array.length(); i++) {    
JSONObject slider_obj = datalist_array.getJSONObject(i);        
DatalistBean datalistBean = new DatalistBean();   
 datalistBean.id = slider_obj.getLong("id");    
  datalistBean.sortindex = slider_obj.getString("sortindex");               
  datalistBean.type = slider_obj.getString("type");   
 JSONObject details = slider_obj.getJSONObject("details");          
 DynamicItemBean dynamicItemBean = new DynamicItemBean();          
  dynamicItemBean.id = details.getLong("id");  
 dynamicItemBean.title = details.getString("title");     
dynamicItemBean.imagearray = new ArrayList<String>();  
  switch (datalistBean.type) {        
    case "article":                        
    dynamicItemBean.url = details.getString("url");           
   JSONArray imageurl_array = details.getJSONArray("imageurl");                
    if (imageurl_array.length() != 0) {               
    for (int b = 0; b < imageurl_array.length(); b++) {                    
    dynamicItemBean.imagearray.add(imageurl_array.getString(b));                    
    }          
   }         
   break;
case "cartoon":    
  dynamicItemBean.imageurl = details.getString("imageurl");      
  dynamicItemBean.needpay = details.getInt("needpay");        
  dynamicItemBean.url = details.getString("url");    
  break;
   }    
  datalistBean.details = dynamicItemBean;        
  dynamic_list.add(datalistBean);//dynamic_list为所要填充的集合
}
} catch (JSONException e) {    
  e.printStackTrace();
}

这里要特别注意一点,设置imagearray为集合类型的时候,赋值的时候
需要添加如下代码进行初始化,不然的话取值不到:

dynamicItemBean.imagearray = new ArrayList<String>();

还有有可能后台返回数据datalist为null的情况,这样的话前面就需要加个判断,是否为null,为null的话就不解析了:

if(obj.isNull("datalist")){ 
 return;
}

三方的运用越来越便捷,但是原先基础的解析也忘的都差不多了。其实手动解析也没有想象的那么难,一切反动派都是纸老虎啊。
哈哈,与诸君共勉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容