Java如何獲取JSONObject內(nèi)指定字段key的value值
Java獲取JSONObject內(nèi)指定字段key的value值
項(xiàng)目場(chǎng)景一
獲?。篿d
{
"code": "success",
"data": {
"user": {
"id": "6286f2c0-6399-11ec-800b-f7f07b836bd8",
},
"exp": 1667880458
}
}解決方案:
通過JSONObject解決
String id = object.getJSONObject("user").getString("id");項(xiàng)目場(chǎng)景二
獲?。篶ode
{"http_code":200,"code":"0","message":"SUCCESS"}解決方案:
通過JSONObject解決
JSONObject.getString("code");根據(jù)json的key獲取到對(duì)應(yīng)的value
項(xiàng)目中偶爾會(huì)用到解析json,然后獲取某個(gè)key的值的問題,這個(gè)有兩個(gè)辦法,一個(gè)是通過json創(chuàng)建一個(gè)對(duì)象出來,然后通過json轉(zhuǎn)對(duì)象,然后通過對(duì)象獲取對(duì)應(yīng)的value,第二個(gè)是通過JsonObject獲取對(duì)應(yīng)key的value,但是只能從頂級(jí)一層一層的獲取你想要的值。
如果json簡單,兩種方法都可以。如果json復(fù)雜一點(diǎn),兩種方法都挺麻煩的,所以就打算自己寫一個(gè)工具類,通過傳進(jìn)去一個(gè)key就能直接獲取到value了。
但是有個(gè)問題就是如果key有多個(gè)重復(fù)的話就只能獲取到第一個(gè)key了,不過這個(gè)問題也可以解決,先獲取重復(fù)key外層的key對(duì)應(yīng)的value,然后獲取到的json再多次獲取就可以了。
talk is cheap,show you my code.
json解析用的是fastjson
public class JsonUtil {
/**
* json字符串 轉(zhuǎn)對(duì)象
* @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();
}
/**
* 對(duì)象轉(zhuǎn)json字符串
* @param object
* @return
*/
public static String toJsonString(Object object){
if (object != null) {
return JSON.toJSONString(object);
}
return null;
}
/**
* 根據(jù)json 中的可以 獲取對(duì)應(yīng)value,只會(huì)獲取第一個(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 中的可以 獲取對(duì)應(yīng)value,只會(huì)獲取第一個(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;
}
}
測(cè)試
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的特性來獲取的。
可以看到能夠獲取到對(duì)應(yīng)key的value,但是前面也說了,重復(fù)的key的話只能獲取到第一個(gè)value。
如果用對(duì)象的或者一層一層獲取的話不會(huì)存在這個(gè)問題。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java-collection中的null,isEmpty用法
這篇文章主要介紹了java-collection中的null,isEmpty用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java實(shí)現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例
駝峰和下劃線互轉(zhuǎn)場(chǎng)景是在不同命名規(guī)范的情況下,需要進(jìn)行字段名稱的轉(zhuǎn)換,本文就來介紹一下Java實(shí)現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例,感興趣的可以了解一下2023-12-12
idea無法識(shí)別注解,或pom文件異常的問題及解決
文章介紹了三種解決IDEA無法識(shí)別注解或POM文件異常的方法:1.檢查省電模式設(shè)置;2.為未識(shí)別的POM文件添加Maven工程;3.移除并重新添加有問題的模塊2026-01-01
java怎么創(chuàng)建目錄(刪除/修改/復(fù)制目錄及文件)代碼實(shí)例
這篇文章主要介紹了java怎么創(chuàng)建目錄,還包括刪除/修改/復(fù)制目錄及文件,代碼簡單,下面直接看代碼吧2013-12-12
java面向?qū)ο蠡A(chǔ)_final詳細(xì)介紹
本文將詳細(xì)介紹java final 對(duì)象的使用,需要了解更多的朋友可以參考下2012-11-11

