项目中偶尔会用到解析json,然后获取某个key的值的问题,这个有两个办法,一个是通过json创建一个对象出来,然后通过json转对象,然后通过对象获取对应的value,第二个是通过JsonObject获取对应key的value,但是只能从顶级一层一层的获取你想要的值。
如果json简单,两种方法都可以。如果json复杂一点,两种方法都挺麻烦的,所以就打算自己写一个工具类,通过传进去一个key就能直接获取到value了。
但是有个问题就是如果key有多个重复的话就只能获取到第一个key了,不过这个问题也可以解决,先获取重复key外层的key对应的value,然后获取到的json再多次获取就可以了。
talk is cheap,show you my code.
json解析用的是fastjson
public class JsonUtil { /** * json字符串 转对象 * @param jsonString * @param <T> * @return */ public static <T> T toObject(String jsonString , Class<T> clz){ if (StringUtils.isNotEmpty(jsonString)) { return JSON.parseObject(jsonString , clz); } return null; } /** * jsonString 转list * @param jsonString * @param clz * @param <T> * @return */ public static <T> List<T> toList(String jsonString , Class<T> clz){ if (StringUtils.isNotEmpty(jsonString)) { return JSON.parseArray(jsonString, clz); } return Collections.emptyList(); } /** * 对象转json字符串 * @param object * @return */ public static String toJsonString(Object object){ if (object != null) { return JSON.toJSONString(object); } return null; } /** * 根据json 中的可以 获取对应value,只会获取第一个被匹配到的值 * @param json json 字符串 * @param key * @return 返回结果类型可能是 JSONObject、String、JSONArray */ public static Object getJsonValue(String json , String key){ if (StringUtils.isNotEmpty(json) && StringUtils.isNotEmpty(key)) { Object object = JSON.parse(json); if (object != null) { if (object instanceof JSONObject) { return getJsonValue((JSONObject) object, key); }else if (object instanceof JSONArray){ return getJsonValue((JSONArray) object, key); } } return object; } throw new IllegalArgumentException("param json or key cannot be empty."); } /** * 根据json 中的可以 获取对应value,只会获取第一个被匹配到的值 * @param jsonObject * @param key * @return 返回结果类型可能是 JSONObject、String、JSONArray */ public static Object getJsonValue(JSONObject jsonObject , String key) { if (jsonObject != null && StringUtils.isNotEmpty(key)) { for (Map.Entry<String, Object> entry : jsonObject.entrySet()) { String entryKey = entry.getKey(); Object value = entry.getValue(); if (key.equals(entryKey)) { return value; } else { if (value != null) { String s = value.toString(); if (StringUtils.isNotEmpty(s)) { Object jsonValue = getJsonValue(value, key); if (jsonValue != null) { return jsonValue; } } } } } return null; } throw new IllegalArgumentException("param jsonObject or key cannot by empty."); } public static Object getJsonValue(Object object , String key){ if (object != null && StringUtils.isNotEmpty(key)) { if (object instanceof JSONObject) { return getJsonValue((JSONObject) object, key); }else if (object instanceof JSONArray){ return getJsonValue((JSONArray) object, key); } } return null; } public static Object getJsonValue(JSONArray jsonArray , String key) { if (jsonArray != null && StringUtils.isNotEmpty(key)) { for (Object next : jsonArray) { if (next != null) { return getJsonValue(next, key); } } } return null; } }
测试:
json 如下:
{ "results" : [ { "access_points" : [], "address_components" : [ { "long_name" : "1600", "short_name" : "1600", "types" : [ "street_number" ] }, { "long_name" : "Amphitheatre Parkway", "short_name" : "Amphitheatre Pkwy", "types" : [ "route" ] }, { "long_name" : "Mountain View", "short_name" : "Mountain View", "types" : [ "locality", "political" ] }, { "long_name" : "Santa Clara County", "short_name" : "Santa Clara County", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "California", "short_name" : "CA", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "美国", "short_name" : "US", "types" : [ "country", "political" ] }, { "long_name" : "94043", "short_name" : "94043", "types" : [ "postal_code" ] } ], "formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043美国", "geometry" : { "location" : { "lat" : 37.4223097, "lng" : -122.0846245 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 37.4236586802915, "lng" : -122.0832755197085 }, "southwest" : { "lat" : 37.4209607197085, "lng" : -122.0859734802915 } } }, "place_id" : "ChIJtYuu0V25j4ARwu5e4wwRYgE", "plus_code" : { "compound_code" : "CWC8+W5 美国 California, 山景城", "global_code" : "849VCWC8+W5" }, "types" : [ "street_address" ] } ], "status" : "OK" }
Object content = JsonUtil.getJsonValue(json, "northeast");
结果:
{"lng":-122.0832755197085,"lat":37.4236586802915}
通过fastjson源码可以看到,json解析用的是map,所以获取的时候也是根据map的特性来获取的。
可以看到能够获取到对应key的value,但是前面也说了,重复的key的话只能获取到第一个value。
如果用对象的或者一层一层获取的话不会存在这个问题。
能力有限,水平一般,如果有更好的方法请评论告诉我。