Java如何獲取JSONObject內(nèi)指定字段key的value值
Java獲取JSONObject內(nèi)指定字段key的value值
項(xiàng)目場景一
獲取:id
{ "code": "success", "data": { "user": { "id": "6286f2c0-6399-11ec-800b-f7f07b836bd8", }, "exp": 1667880458 } }
解決方案:
通過JSONObject解決
String id = object.getJSONObject("user").getString("id");
項(xiàng)目場景二
獲?。篶ode
{"http_code":200,"code":"0","message":"SUCCESS"}
解決方案:
通過JSONObject解決
JSONObject.getString("code");
根據(jù)json的key獲取到對應(yīng)的value
項(xiàng)目中偶爾會用到解析json,然后獲取某個(gè)key的值的問題,這個(gè)有兩個(gè)辦法,一個(gè)是通過json創(chuàng)建一個(gè)對象出來,然后通過json轉(zhuǎn)對象,然后通過對象獲取對應(yīng)的value,第二個(gè)是通過JsonObject獲取對應(yīng)key的value,但是只能從頂級一層一層的獲取你想要的值。
如果json簡單,兩種方法都可以。如果json復(fù)雜一點(diǎn),兩種方法都挺麻煩的,所以就打算自己寫一個(gè)工具類,通過傳進(jìn)去一個(gè)key就能直接獲取到value了。
但是有個(gè)問題就是如果key有多個(gè)重復(fù)的話就只能獲取到第一個(gè)key了,不過這個(gè)問題也可以解決,先獲取重復(fù)key外層的key對應(yīng)的value,然后獲取到的json再多次獲取就可以了。
talk is cheap,show you my code.
json解析用的是fastjson
public class JsonUtil { /** * json字符串 轉(zhuǎn)對象 * @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 轉(zhuǎn)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(); } /** * 對象轉(zhuǎn)json字符串 * @param object * @return */ public static String toJsonString(Object object){ if (object != null) { return JSON.toJSONString(object); } return null; } /** * 根據(jù)json 中的可以 獲取對應(yīng)value,只會獲取第一個(gè)被匹配到的值 * @param json json 字符串 * @param key * @return 返回結(jié)果類型可能是 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."); } /** * 根據(jù)json 中的可以 獲取對應(yīng)value,只會獲取第一個(gè)被匹配到的值 * @param jsonObject * @param key * @return 返回結(jié)果類型可能是 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");
結(jié)果:
{"lng":-122.0832755197085,"lat":37.4236586802915}
通過fastjson源碼可以看到,json解析用的是map,所以獲取的時(shí)候也是根據(jù)map的特性來獲取的。
可以看到能夠獲取到對應(yīng)key的value,但是前面也說了,重復(fù)的key的話只能獲取到第一個(gè)value。
如果用對象的或者一層一層獲取的話不會存在這個(gè)問題。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法
- Java中如何將String轉(zhuǎn)JSONObject
- java中如何判斷JSONObject是否存在某個(gè)Key
- Java使用fastjson對String、JSONObject、JSONArray相互轉(zhuǎn)換
- Java 如何遍歷JsonObject對象
- JAVA中JSONObject對象和Map對象之間的相互轉(zhuǎn)換
- java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實(shí)例)
- Java使用JSONObject需要的6個(gè)jar包下載地址
- 詳解Java中String JSONObject JSONArray List<實(shí)體類>轉(zhuǎn)換
- Java使用JSONObject操作json實(shí)例解析
- Java中的JSONObject使用方法和常用操作
相關(guān)文章
使用spring boot開發(fā)時(shí)java對象和Json對象轉(zhuǎn)換的問題
這篇文章主要介紹了使用spring boot開發(fā)時(shí)java對象和Json對象轉(zhuǎn)換的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來一起學(xué)習(xí)下吧2019-07-07關(guān)于Java錯誤提示之找不到或無法加載主類的問題及正確處理方法
當(dāng)我們在初學(xué)Java的是時(shí)候,類文件中是不設(shè)定包名(package)的,這種情況下注意classpath,基本上沒有問題,?本文主要說明classpath和系統(tǒng)環(huán)境變量PATH都沒問題的情況下出錯原因和正確處理方法,感興趣的朋友一起看看吧2022-01-01簡單說說Java SE、Java EE、Java ME三者之間的區(qū)別
本篇文章小編就為大家簡單說說Java SE、Java EE、Java ME三者之間的區(qū)別。需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10SpringBoot feign動態(tài)設(shè)置數(shù)據(jù)源(https請求)
這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)feign動態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08