1 . fastjson

在fastjson中有些getXXX方法 , 如getString , getInteger , getIntValue等 , 当调用getXXX方法时 , 如果传入的key在json中不存在 , 那调用这些方法会报错抛出异常吗 ?

首先来看代码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));
    }
}

运行结果如下 : 

18123
18123
18123
null
null
0

可看到 , 对不存在的key值(score)尝试进行getXXX时 , 会返回当前类型的默认值(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就是调用get方法 , 然后判断为null , 为null则返回null , 否则调用对象的toString()方法.
  • getInteger就是相当于调用get方法 , 然后调用castToInt方法将Ojbect对象转换为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中进行了判断 , 如果value值为null , 则直接返回null , 那getIntValue怎么判断的呢 , getIntValue源码如下 : 

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

原来在调用castToInt之前 ,就先做了一次null的判断 , 为null直接返回了0 . 

那调用get方法获取一个不存在的key时 , 为什么会返回null而不是报错呢 , 查看get源码如下

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

map是JSONObject的一个成员变量

private final Map<String, Object> map;

原来 , JSONObject先将json字符串转换为了一个map , 而map的get方法获取不存在的key时 , 返回的就是null . 

由此可以看到 , fastjson对不存在的key做了判断 , 如果没有则会返回类型的默认值 . 

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更加严格 , 在使用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;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

关于JSON解析中获取不存在的key问题的更多相关文章

  1. 【swift】15-0520 字典

    字典.count()字典.isEmpty字典[key]=value//增加一个值字典[key]=value2//修改一个值字典.updateValue//返回一个optional类型的值,需要更新的key不存在则更新失败,所以一般用if语句进行判断,if字典.updateValue{println}else{println}用binding显示出值。iflet常量=字典.updateValue{println(“”)}else{println(“”)}显示字典中所有的键值对:forin字典{println

  2. Swift-字典

  3. Swift 字典的常用方法

    /***要正确使用字典,也需要一些条件*1,字典键值对的键和值的类型必须明确,可以直接指定,也可以类似数组直接赋值由编译器自动识别*2,字典必须要初始化*3,键的类型必须是可以被哈希Hashable的**///字典的几种声明方式常用方法见下方代码苹果开发群:414319235欢迎加入欢迎讨论

  4. swift 2.0 字典

    //6.字典---的特点:无序性这个无序性是指字典内部存放的元素顺序跟我们定义时写的元素顺序是没有对应的,但是实质上,字典内部的元素是有序的。),至于为什么,之后会有专门的解说。//并且,字典的key值是唯一的,不能重复。

  5. swift * 字典/Dictionary初始化以及增、删、改、遍历

    学习笔记1、字典初始化vardict=[:]//初始化无类型空字典dict=["1":"aaa","2":"bbb"]print(dict)dict=[1:"1","2":2]//key和value都是不定类型的print(dict)letdict2:Dictionary=["1":111,"2":222]//限定键值类型print(dict2)letdict3:[Stri

  6. Swift基础学习2

    1.数组的创建及操作2.Range的创建3.Dictionary的创建及操作4.func5.闭包

  7. swift dictionary 是否存在key

  8. 是否应该使用可选映射?

    和之前使用可选映射的功能并无区别,但是意义上更加清晰了。略微有点可选映射能够有效避免可能发生的错误吗?有可能,但是也可能带来问题可选映射能够更好地表达编程的思路吗?对于我来说不,但是有可能让那些理解「映射」和「可选值」的人来说是使用可选映射维护代码能变简单吗?

  9. Swift NSKeyedArchiver

    1.在带键的归档中,每个归档字段都有一个key值,解归档时key值要与归档时key值匹配2.带键归档可以一次存储多个对象3.归档的对象是Foundation框架中的对象4.归档和解归档其中任意对象都需要归档和解归档整个文件5.归档后的文件是加密的,所以归档文件的扩展名可以随意取

  10. swift中dictionary字典的使用

    Swift字典用来存储无序的相同类型数据的集合,Swift字典会强制检测元素的类型,如果类型不同则会报错。和数组中的数据项不同,字典中的数据项并没有具体顺序。Swift字典的key没有类型限制可以是整型或字符串,但必须是唯一的。这意味着在创建字典后,可以通过添加、删除、修改的方式改变字典里的项目。如果将一个字典赋值给常量,字典就不可修改,并且字典的大小和内容都不可以修改。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部