android複雜json解析

gao_chun發表於2014-09-23
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":"參展企業名錄
1

XXX投資有限公司

2

XXX網路科技有限公司

3

XXX齋科技有限公司

"},			{"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<GoodsResultItem> 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<GoodsResultItem> goodsItemList;//menuList中的集合
        GoodsResultItem mGoodsItem;         //menuList子條目
        try {
            if(object != null && !TextUtils.isEmpty(object))
            {
                JSONObject obj = new JSONObject(object);
                mGoodsResultInfo = new GoodsResultInfo();
                goodsItemList = new ArrayList<GoodsResultItem>();

                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=<p><a target="_self" href="http://www.365yunshang.com/10805">
<img style="width: 310px; height: 383px;" src="http://xxx/company/ueditor1_3_5/jsp/upload/140637404.jpg" 
title="[$1LWSKPQJ72_TY])3AS.jpg" border="0" height="383" hspace="0" 
vspace="0" width="310"/></a></p>, 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來完成,但是內部實現方式和原理都是類同的。(此方式僅供參考)

相關文章