最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于JSON解析中獲取不存在的key問題

 更新時間:2022年07月06日 10:44:03   作者:BlueKitty1210  
這篇文章主要介紹了關(guān)于JSON解析中獲取不存在的key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1 . fastjson

在fastjson中有些getXXX方法 , 如getString , getInteger , getIntValue等 , 當(dāng)調(diào)用getXXX方法時 , 如果傳入的key在json中不存在 , 那調(diào)用這些方法會報錯拋出異常嗎 ?

首先來看代碼demo

public static void main(String[] args) {
    String str = "{\"name\":\"Bob\",\"age\":\"18123\"}";
    JSONObject jsonObject = JSON.parseObject(str);
    String[] keys = { "age" ,   "score"};
    for(String key : keys){
		System.out.println(jsonObject.getString(key));
		System.out.println(jsonObject.getInteger(key));
		System.out.println(jsonObject.getIntValue(key));
    }
}

運(yùn)行結(jié)果如下 : 

18123
18123
18123
null
null
0

可看到 , 對不存在的key值(score)嘗試進(jìn)行g(shù)etXXX時 , 會返回當(dāng)前類型的默認(rèn)值(String返回null , Integer返回null , intValue返回0)

查看getString/getInteger源碼如下 : 

public String getString(String key) {
    Object value = get(key);
    if (value == null) {
        return null;
    }
    return value.toString();
}
public Integer getInteger(String key) {
   Object value = get(key);	
   return castToInt(value);
}
  • getString就是調(diào)用get方法 , 然后判斷為null , 為null則返回null , 否則調(diào)用對象的toString()方法.
  • getInteger就是相當(dāng)于調(diào)用get方法 , 然后調(diào)用castToInt方法將Ojbect對象轉(zhuǎn)換為Integer對象 , castToInt方法如下 : 
public static Integer castToInt(Object value) {
    if (value == null) {
        return null;
    }
 
    if (value instanceof Integer) {
        return (Integer) value;
    }
 
    if (value instanceof Number) {
        return ((Number) value).intValue();
    }
 
    if (value instanceof String) {
        String strVal = (String) value;
 
        if (strVal.length() == 0 //
            || "null".equals(strVal) //
            || "NULL".equals(strVal)) {
            return null;
        }
        
        if (strVal.indexOf(',') != 0) {
            strVal = strVal.replaceAll(",", "");
        }
 
        return Integer.parseInt(strVal);
    }
 
    if (value instanceof Boolean) {
        return ((Boolean) value).booleanValue() ? 1 : 0;
    }
 
    throw new JSONException("can not cast to int, value : " + value);
}

首先看到第一個if中進(jìn)行了判斷 , 如果value值為null , 則直接返回null , 那getIntValue怎么判斷的呢 , getIntValue源碼如下 : 

public int getIntValue(String key) {
    Object value = get(key);
 
    if (value == null) {
        return 0;
    }
 
    return castToInt(value).intValue();
}

原來在調(diào)用castToInt之前 ,就先做了一次null的判斷 , 為null直接返回了0 . 

那調(diào)用get方法獲取一個不存在的key時 , 為什么會返回null而不是報錯呢 , 查看get源碼如下

public Object get(Object key) {
    return map.get(key);
}

map是JSONObject的一個成員變量

private final Map<String, Object> map;

原來 , JSONObject先將json字符串轉(zhuǎn)換為了一個map , 而map的get方法獲取不存在的key時 , 返回的就是null . 

由此可以看到 , fastjson對不存在的key做了判斷 , 如果沒有則會返回類型的默認(rèn)值 . 

2 . net.sf.json

    public static void main(String[] args) {
        String str = "{\"name\":\"Bob\",\"age\":\"18\"}";
        JSONObject jsonObject = JSONObject.fromObject(str);
//        System.out.println(jsonObject.get("gender"));//null
//        System.out.println(jsonObject.getString("gender"));//JSONObject["gender"] not found
//        System.out.println(jsonObject.getInt("age"));//18
        System.out.println(jsonObject.getInt("score"));//JSONObject["score"] is not a number
 
    }

可以看到和fastjson的處理策略不同 , 它是對不存在的key拋出一個JSONException異常 , 查看源碼可以看到

    public String getString(String key) {
        this.verifyIsNull();
        Object o = this.get(key);
        if (o != null) {
            return o.toString();
        } else {
            throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not found.");
        }
    }
    public int getInt(String key) {
        this.verifyIsNull();
        Object o = this.get(key);
        if (o != null) {
            return o instanceof Number ? ((Number)o).intValue() : (int)this.getDouble(key);
        } else {
            throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
        }
    }

3 . org.json

和net.sf.json一樣 , org.json對不存在的key策略還是拋出異常 . 但org.json更加嚴(yán)格 , 在使用get("key")時就會直接拋出異常

    public static void main(String[] args) throws Exception {
        String str = "{\"name\":\"Bob\",\"age\":\"18\"}";
        JSONObject jsonObject = new JSONObject(str);
        System.out.println(jsonObject.get("gender"));//No value for gender
        System.out.println(jsonObject.getString("gender"));//No value for gender
        System.out.println(jsonObject.getInt("age"));//18
        System.out.println(jsonObject.getInt("score"));//No value for score
    }

get方法源碼如下 : 

    public Object get(String name) throws JSONException {
        Object result = nameValuePairs.get(name);
        if (result == null) {
            throw new JSONException("No value for " + name);
        }
        return result;
    }

getString源碼如下 , getInt與之類似 : 

    public int getInt(String name) throws JSONException {
        Object object = get(name);
        Integer result = JSON.toInteger(object);
        if (result == null) {
            throw JSON.typeMismatch(name, object, "int");
        }
        return result;
    }

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA中如何去掉Java方法注釋后的空行

    IDEA中如何去掉Java方法注釋后的空行

    本文介紹了如何在IntelliJIDEA中去掉Java方法注釋后多余的空行,并提供了詳細(xì)的操作步驟,通過修改設(shè)置,可以避免默認(rèn)格式化過程中自動插入的空行,使Javadoc注釋更加緊湊和清晰,符合個人或團(tuán)隊(duì)的代碼規(guī)范
    2025-02-02
  • 深入介紹Spring框架及故障排除

    深入介紹Spring框架及故障排除

    這篇文章主要介紹了深入介紹Spring框架及故障排除,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Java的三種代理模式簡述

    Java的三種代理模式簡述

    這篇文章主要簡述Java的三種代理模式,java的代理模式主要包括靜態(tài)代理、動態(tài)代理、Cglib代理,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Spring Data JPA 整合QueryDSL的使用案例

    Spring Data JPA 整合QueryDSL的使用案例

    QueryDSL 是一個用于構(gòu)建類型安全的 SQL 查詢的 Java 庫,它的主要目標(biāo)是簡化在 Java 中構(gòu)建和執(zhí)行 SQL 查詢的過程,同時提供類型安全性和更好的編碼體驗(yàn),對Spring Data JPA 整合QueryDSL使用案例感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解

    Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解

    要想實(shí)現(xiàn)網(wǎng)絡(luò)編程,除了可以使用Socket之外,我們還可以利用URL編程或HTTP編程技術(shù),所以今天這篇文章,就給大家介紹一下URL編程和HTTP編程技術(shù),看看這兩種技術(shù)有什么特點(diǎn),文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2023-11-11
  • java日期處理工具類

    java日期處理工具類

    這篇文章主要為大家詳細(xì)介紹了java日期處理工具類,其次還介紹了日期處理的基礎(chǔ)知識,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • SpringBoot 攔截器和自定義注解判斷請求是否合法

    SpringBoot 攔截器和自定義注解判斷請求是否合法

    這篇文章主要介紹了SpringBoot 攔截器和自定義注解判斷請求是否合法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-12-12
  • Java多線程下的其他組件之CyclicBarrier、Callable、Future和FutureTask詳解

    Java多線程下的其他組件之CyclicBarrier、Callable、Future和FutureTask詳解

    這篇文章主要介紹了Java多線程下的其他組件之CyclicBarrier、Callable、Future和FutureTask詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot2中使用@RequestHeader獲取請求頭的方法

    SpringBoot2中使用@RequestHeader獲取請求頭的方法

    springMVC/SpringBoot中提供了@RequestHeader注解用來獲取請求頭。本文就詳細(xì)的來介紹一下如何使用,感興趣的可以了解下
    2021-10-10
  • SpringBoot項(xiàng)目多數(shù)據(jù)源及mybatis 駝峰失效的問題解決方法

    SpringBoot項(xiàng)目多數(shù)據(jù)源及mybatis 駝峰失效的問題解決方法

    這篇文章主要介紹了SpringBoot項(xiàng)目多數(shù)據(jù)源及mybatis 駝峰失效的問題解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論

无锡市| 顺平县| 阿拉善左旗| 玉屏| 福泉市| 洪湖市| 商河县| 九寨沟县| 凤冈县| 五峰| 宁都县| 曲水县| 威宁| 巴彦县| 乐陵市| 仙游县| 云梦县| 宜春市| 博白县| 宜良县| 黄龙县| 台南县| 马龙县| 和平县| 利辛县| 满洲里市| 南宫市| 刚察县| 凤山县| 新建县| 乡宁县| 阳高县| 满洲里市| 堆龙德庆县| 沙雅县| 濉溪县| 正安县| 乌兰察布市| 海伦市| 元谋县| 塔城市|