Json数据解析

1。 解析Json数据时,应该层层分解,从最小的数据单元下手,慢慢解析更大单元的数据。可能是一个JsonObject,或者是一个JsonArray,JsonObject获得STring,Int等数据时,最好选用opt方法,而不要使用get方法,这样可以防止空指针。
2。 在本地代码中新建数据类,跟json数据单元相对应,便于分解。另外代码框架的设计也应该和实际需求相结合,相对应,否则会复杂化
3。 在数据解析的过程中一定要注意判空,不然很容易因为空指针而crash,要养成良好的编码习惯,判空不能仅仅根据是不是null来判定,还要判定是否内容为空,如array的长度是否是0

 public static boolean isJsonNull(JSONArray jsonArray)
    {
        if((jsonArray == null) || (jsonArray.length() ==0))
        {
            return true;
        }
        return false;
    }

    public static boolean isJsonNull(String jsonStr)
    {
        if((jsonStr == null) || (jsonStr.isEmpty()))
        {
            return true;
        }
        return false;
    }

    public static boolean isJsonNull(JSONObject jsonObject)
    {
        if((jsonObject == null))
        {
            return true;
        }
        return false;
    }
package com.tmall.bifrost.data.share.condition;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

import com.tmall.bifrost.invokers.mgr.BFRuleMgr;
import com.tmall.bifrost.util.BFConstant;
import com.tmall.bifrost.util.BFUtil;

import org.json.JSONObject;

/**
 * Created by scucheri on 16/1/7.
 */
public class BFTimeCondition {
    private final String keyStartTime = "start";
    private final String keyStopTime = "end";

    public long startTime;
    public long stopTime;

    public boolean isEmpty = false;

    private final int MSG_TIME = 0;

    Handler timeHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_TIME:
                    BFRuleMgr.getInstance().updateCurrentRules(BFConstant.CONDITION_TIME);
                    break;
            }
            super.handleMessage(msg);
        }
    };


    public BFTimeCondition(JSONObject timeObject)
    {
        if(BFUtil.isJsonNull(timeObject))
        {
            isEmpty = true;
            return;
        }
        startTime = timeObject.optLong(keyStartTime);
        stopTime = timeObject.optLong(keyStopTime);
    }

    public boolean isTimeValid() {
        if(isEmpty)
        {
            return true;
        }
        long currentTime = BFUtil.getCurrentTimeMillis();
        if((startTime <= currentTime)&&(stopTime >= currentTime))
        {
            return true;
        }

        if((startTime > currentTime) && (currentTime >= startTime - 3600*1000))//提前1 小时开启倒计时
        {
            Message msg = timeHandler.obtainMessage();
            msg.what = MSG_TIME;
            timeHandler.sendMessageDelayed(msg, startTime - currentTime + 1);
//            Log.d("tingxiang wait open","000");
        }


        if((stopTime > currentTime) && (currentTime >= stopTime - 3600*1000))//提前1 小时开启倒计时
        {
            Message msg = timeHandler.obtainMessage();
            msg.what = MSG_TIME;
            timeHandler.sendMessageDelayed(msg, stopTime - currentTime +1);
//            Log.d("tingxiang wait close", "111");
        }

        return false;
    }

}
package com.tmall.bifrost.data.share.condition;

import com.tmall.bifrost.util.BFConstant;
import com.tmall.bifrost.util.BFUtil;

import org.json.JSONObject;

import java.util.ArrayList;

/**
 * Created by scucheri on 16/1/7.
 */
public class BFCondition {
    private final String keyTime = "time";
    private BFTimeCondition timeCondition;

    private final String keyPage = "page";
    private BFPageCondition pageCondition;

    private final String keyNetwork = "network";
    private BFNetworkCondition networkCondition;

    public ArrayList<String> conditionList = new ArrayList<String>();

    private boolean isEmpty = false;

    public BFCondition(JSONObject conditionObject)
    {
        if(BFUtil.isJsonNull(conditionObject))
        {
            isEmpty = true;
            return;
        }

        timeCondition = new BFTimeCondition(conditionObject.optJSONObject(keyTime));

        pageCondition = new BFPageCondition(conditionObject.optString(keyPage));

        networkCondition = new BFNetworkCondition(conditionObject.optJSONObject(keyNetwork));

        updateConditionList();
    }

    private void updateConditionList() {
        if(timeCondition.isEmpty == false)
        {
            conditionList.add(BFConstant.CONDITION_TIME);
        }
        if(networkCondition.isEmpty == false)
        {
            conditionList.add(BFConstant.CONDITION_NET);
        }
    }

    public boolean isConditionValid(String pageName)
    {
        if(isEmpty)
        {
            return true;
        }
        return timeCondition.isTimeValid() && pageCondition.isPageValid(pageName) && networkCondition.isNetworkValid();
    }

    public String getConditionName()
    {
        return timeCondition.startTime+timeCondition.stopTime
                +BFUtil.getNoneNullString(networkCondition.configSsid)
                +BFUtil.getNoneNullString(pageCondition.pageConfig);
    }
}
package com.tmall.bifrost.data.page;

import com.tmall.bifrost.data.share.BFRuleData;
import com.tmall.bifrost.util.BFUtil;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

/**
 * Created by scucheri on 16/1/7.
 */
public class BFPageConfigModule {
    private final String keyEvent = "event";
    private final String keyEnable = "enable";
    private final String keyRules = "rules";

    public boolean enable;
    public String moduleType = "";
    private ArrayList<BFRuleData> ruleList = new ArrayList<BFRuleData>();

    public BFPageConfigModule(JSONObject moduleObject) {
        if(BFUtil.isJsonNull(moduleObject))
        {
            return;
        }
        enable = moduleObject.optBoolean(keyEnable);
        moduleType = moduleObject.optString(keyEvent);

//        Log.d("tingxiang minsk", moduleType +enable);

            try {
                JSONArray ruleArray = moduleObject.optJSONArray(keyRules);
                if(ruleArray != null)
                {
                    for (int i = 0; i < ruleArray.length(); i++) {
                        JSONObject ruleObject = ruleArray.getJSONObject(i);
                        ruleList.add(new BFRuleData(ruleObject));
                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
    }


    public ArrayList<BFRuleData> getEnableRuleList(String pageName)
    {
        ArrayList<BFRuleData> list = new ArrayList<BFRuleData>();
        if(enable)
        {
            for (BFRuleData rule : ruleList) {
                if (rule.isRuleEnable(pageName)) {
                    list.add(rule);
                }
            }
        }
        return list;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值