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;
}
}