android複雜json解析
JSON建構有兩種結構:對象和數組
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組2種結構,通過這兩種結構可以表示各種複雜的結構。
以下是項目中的一段json格式,也並不算很複雜,貼出解析方式和思路:
{"result":true,"msgType":3,"count":16,"batchId":"hb20140711","companyFullName":"湖北省網博會展有限公司","goodsId":"P002","goodsName":"湖北?葛店互連網產業博覽會","goodsDes":"3AS.jpg","goodsImg":"/company/download/goods_img/9a036-4c39-418d-a1d7-d5dadba66ab3.jpg","menuList":[{"title":"參展引導","menuContent":"c.jpg\""c2.jpg\""c3.jpg\""},{"title":"參展商家","menuContent":"?參展企業名錄1XXX投資有限公司2XXX網路科技有限公司3XXX齋科技有限公司"},{"title":"展會概況","menuContent":"博 覽 會 概 況一、博覽會地點和排程 報到布展:2014年8月14-15日 08:30-17:00 開展時間:2014年8月16日 08:30-17:00 2014年8月17日 08:30-17:00 2014年8月18日 08:30-14:00 "}]}
分析:1.單個實體有個多屬性2.實體中存在集合3.集合中也有各自的屬性
解決思路:1.建立實體(商品資訊的實體、集合menuList中的實體)2.商品實體類中建立List<集合menuList實體>3.解析完基本商品資訊後將menuList集合添加到其中
商品實體資訊:GoodsResultInfo.java
/******************************************************************************* * * Copyright (c) Weaver Info Tech Co. Ltd * * GoodsResultInfo * * app.backend.model.GoodsResultInfo.java * TODO: File description or class description. * * @author: gao_chun * @since: 2014年9月22日 * @version: 1.0.0 * * @changeLogs: * 1.0.0: First created this class. * ******************************************************************************/package app.backend.model;import java.io.Serializable;import java.util.List;/** *@author gao_chun * */public class GoodsResultInfo implements Serializable{ private static final long serialVersionUID = 1L; private String batchId; private int count; private String companyFullName; private String goodsDes; private String goodsId; private String goodsImg; private String goodsName; //private String menuList; private int msgType; private boolean result; private List mGoodsResultItem; //menuList集合 //get 、set 方法省略 }
menuList實體資訊:GoodsResultItem.java
/******************************************************************************* * * Copyright (c) Weaver Info Tech Co. Ltd * * GoodsResultItem * * app.backend.model.GoodsResultItem.java * TODO: File description or class description. * * @author: gao_chun * @since: 2014年9月22日 * @version: 1.0.0 * * @changeLogs: * 1.0.0: First created this class. * ******************************************************************************/package app.backend.model;import java.io.Serializable;/** *@author gao_chun * */public class GoodsResultItem implements Serializable{ private String title; private String menuContent; //get 、 set 方法省略}
解析器封裝:GoodsResultParser.java
/******************************************************************************* * * Copyright (c) Weaver Info Tech Co. Ltd * * AuthnParser * * web.demo.parse.LoginParser.java * TODO: File description or class description. * * @author: gao_chun * @since: 2014-9-22 * @version: 1.0.0 * * @changeLogs: * 1.0.0: First created this class. * ******************************************************************************/package app.backend.network.parser;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONObject;import android.text.TextUtils;import app.backend.model.GoodsResultInfo;import app.backend.model.GoodsResultItem;import app.util.Log;/** * @author gao_chun * */public class GoodsResultParser{ /* (non-Javadoc) * @see parseJson(org.json.JSONObject) */ public static GoodsResultInfo parseJson(String object) { Log.i("GoodsResultParser ----------- >",object); GoodsResultInfo mGoodsResultInfo; //結果資訊 List goodsItemList;//menuList中的集合 GoodsResultItem mGoodsItem; //menuList子條目 try { if(object != null && !TextUtils.isEmpty(object)) { JSONObject obj = new JSONObject(object); mGoodsResultInfo = new GoodsResultInfo(); goodsItemList = new ArrayList(); mGoodsResultInfo.setResult(obj.getBoolean("result")); mGoodsResultInfo.setMsgType(obj.getInt("msgType")); mGoodsResultInfo.setCount(obj.getInt("count")); mGoodsResultInfo.setBatchId(obj.getString("batchId")); mGoodsResultInfo.setCompanyFullName(obj.getString("companyFullName")); mGoodsResultInfo.setGoodsId(obj.getString("goodsId")); mGoodsResultInfo.setGoodsName(obj.getString("goodsName")); mGoodsResultInfo.setGoodsDes(obj.getString("goodsDes")); mGoodsResultInfo.setGoodsImg(obj.getString("goodsImg")); // menuList JSONArray menuList = obj.getJSONArray("menuList"); if(menuList != null && menuList.length() > 0) { for (int i = 0; i < menuList.length(); i++) { JSONObject jsonItem = menuList.getJSONObject(i); // 擷取每一個json對象 mGoodsItem = new GoodsResultItem(); //menuList中的條目 mGoodsItem.setTitle(jsonItem.getString("title")); mGoodsItem.setMenuContent(jsonItem.getString("menuContent")); goodsItemList.add(mGoodsItem); //放入集合中 mGoodsResultInfo.setmGoodsResultItem(goodsItemList);//將集合放入商品實體類中 } } return mGoodsResultInfo; } } catch (Exception e) { e.printStackTrace(); } return null; }}
最後的使用以及結果:
//解析結果資料,傳遞到頁面顯示 GoodsResultInfo mGoodsList = GoodsResultParser.parseJson(result); //Intent resultIntent = new Intent(this,GoodsDetailsActivity.class); //resultIntent.putExtra(RESULT,mGoodsList); //startActivity(resultIntent);
結果:
GoodsResultInfo [batchId=hb20140711, count=16, companyFullName=湖北省網博會展有限公司, goodsDes=, goodsId=P002, goodsImg=/company/download/goods_img/937ea036-4c39-418d-a1d7-d5dadba66ab3.jpg, goodsName=湖北?葛店互連網產業博覽會, menuList=null, msgType=3, result=true, mGoodsResultItem=[app.backend.model.GoodsResultItem@42226fd8, app.backend.model.GoodsResultItem@42226af0, app.backend.model.GoodsResultItem@421ff478]]
當然此種解決方式不一定最完善,也可引入第三方開源jar來完成,但是內部實現方式和原理都是類同的。(此方式僅供參考)