架構師之json-----------通過path查詢指定資料

nannan408發表於2015-03-31
1.前言
如題。
2.程式碼.



import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lijunnan.JsonTypeEnum;

/**
*
* @author 李俊南
*
*/
public class JsonUtil {
private static final Logger logger = Logger.getLogger(JsonUtil.class);

/**
* 獲取object需要的json型別,只針對jsonobject.get的object
*
* @param object
* 需要判斷的json物件
* @return object匹配的型別
*/
public static JsonTypeEnum getType(Object object) {
if (object instanceof String) {
return JsonTypeEnum.String;
} else if (StringUtils.isNumeric(object.toString())) {
return JsonTypeEnum.Number;
} else if (object instanceof JSONObject) {
return JsonTypeEnum.JSONObject;
} else if (object instanceof JSONArray) {
return JsonTypeEnum.jsonArray;
} else {
return JsonTypeEnum.Other;
}
}

/**
* 根據對應的path如A.b1.c1,獲取最裡層的json的String的值 jaonarray先不考慮
*
* @param json
* 需要解析的jsonobject
* @param path
* 格式為形如a.b.c.d
*
*
* @return 如果沒找到或者異常則返回null,否則返回找到的對應值
*/
public static String getJsonValueByPath(String jsonObjectString, String path) {
try {
JSONObject json = JSONObject.parseObject(jsonObjectString);
logger.info("分析資料:"+jsonObjectString+"path:"+path);
if (StringUtils.isEmpty(path) || null == json) {
return null;
}
// 1.如果不包含.號,則是第一層
if (!path.contains(".")) {
return json.getString(path);
} else {
// 包含.號的,至少一層以上的層級,層層獲取
String[] paths = StringUtils.split(path, ".");
JSONObject objectLast = json;
for (int i = 0; i < paths.length; i++) {
Object objectTemp = objectLast.get(paths[i]);
if(null==objectTemp){
return null;
}
JsonTypeEnum jsonType = getType(objectTemp);
if (jsonType == JsonTypeEnum.String) {
// 找到String,則返回
return (String) objectTemp;
} else if (jsonType == JsonTypeEnum.Number) {
return String.valueOf(objectTemp);
} else if (jsonType == JsonTypeEnum.JSONObject) {
// 沒找到String ,繼續往下找,jaonarray先不考慮
objectLast = (JSONObject) objectTemp;
continue;
}

}

}

} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return null;
}
}



public enum JsonTypeEnum {
String,
jsonArray,
JSONObject,
Number,
Other
}


3.注意事項。
json的jar包可以用net.json的官方jar替代ali的jar。

相關文章