欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-01 21:44:51
...
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。