架构师之json-----------通过path查找指定数据

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。

相关推荐