json学习系列(4)-JSONString对象的optXXX方法的使用

在JSONObject获取value有多种方法,如果使用 getXxx()类型的方法获取value,如getString("key")。如果key不存在的话,这些方法无一例外的都会抛出异常。如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用JSONObject的optXXX方法。

来看一下几个getXxx()方法的源代码实现:

getString:如果key不存在,getString方法会抛出异常,如下所示:

public String getString(String key)
    {
        verifyIsNull();
        Object o = get(key);
        if (o != null)
        {
            return o.toString();
        }
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not found.");
    }

getInt:如果key不存在,getInt方法会抛出异常,如下所示:

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

getDouble:如果key不存在,getDouble方法会抛出异常,如下所示:

public double getDouble(String key)
    {
        verifyIsNull();
        Object o = get(key);
        if (o != null)
        {
            try
            {
                return o instanceof Number ? ((Number) o).doubleValue() : Double.parseDouble((String) o);
            }
            catch (Exception e)
            {
                throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
            }
        }
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");

    }

getBoolean:如果key不存在,getBoolean方法会抛出异常,如下所示:

public boolean getBoolean(String key)
    {
        verifyIsNull();
        Object o = get(key);
        if (o != null)
        {
            if (o.equals(Boolean.FALSE) || (o instanceof String && ((String) o).equalsIgnoreCase("false")))
            {
                return false;
            }
            else if (o.equals(Boolean.TRUE) || (o instanceof String && ((String) o).equalsIgnoreCase("true")))
            {
                return true;
            }
        }
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a Boolean.");
    }

JSONObject有很多optXXX方法,比如optBoolean,optString,optInt。可以看这些方法源码的实现知道,如果JsonObject有这个属性,则返回这个属性,否则返回一个默认值。下面以optString方法为例说明一下其底层实现过程:

public String optString(String key)
    {
        verifyIsNull();
        return optString(key, "");
    }

上面的例子表示如果key值不存在,则返回空字符串。

public String optString(String key, String defaultValue)
    {
        verifyIsNull();
        Object o = opt(key);
        return o != null ? o.toString() : defaultValue;
    }

上面的例子表示如果key值不存在,则返回默认值defaultValue。

时间: 2024-08-28 01:31:12

json学习系列(4)-JSONString对象的optXXX方法的使用的相关文章

json学习系列(3)-JSONObject的过滤设置

我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的实体类: package com.pcitc.json; /** * Person实体类 * * @Description * @author admin * @created 2015年6月29日 下午4:08:40 * @version * @history * @see */ public class Person { private String name; private String add

json学习系列(8)JSON与JAVA数据的相互转换实例

一.完整案例 先定义一个java实体对象,如下: package com.pcitc.json.cnblog; /** * SimInfo实体对象 * * @Description * @author admin * @created 2015年6月30日 上午10:23:21 * @version * @history * @see */ public class SimInfo { private String addTime; private String iccid; private i

单元测试学习系列(一)--- NMock对象及数据库模拟介绍

介绍 单元测试是对一个系统的最小可测试单元的检查和验证,系统里关键点位的规则.关键的逻辑均可建立一个单元测试,但是对于一些存在不确定行为对象的测试或者数据库操作的测试不确定因素比较高,初期对此建立的单元测试往往在中后期被废弃掉,原因无非是数据库表的改变或者数据改变或者对象结构改变等等诸多不确定因素的影响.所以要想系统地建立一个单元测试并最大化其作用,我们必须先解决对象行为的不确定性.可以考虑通过依赖接口的方式将这些行为模块化地进行隔离,单元测试只需要模拟这些接口然后注入到需要单元测试的类中,这样

json学习系列(5)-json错误解析net.sf.ezmorph.bean.MorphDynaBean cannot be cast to

最近在使用json的时候,报了下面的错误: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to java.lang.String 这种错误非常常见,因为json转化为javabean的时候,默认为MorphDynaBean类的.如下面的例子: 在json字符串转javabean时,一般的对象,可以直接转,如:一个学生类,属性有姓名.年龄等. public class Student implements java.io.Serializable

json学习系列(2)-生成JSONObject的方法

生成JSONObject一般有两种方式,通过javabean或者map类型来生成.如下面的例子: 先定义一个User实体类: package com.pcitc.json; /** * 用户实体类 * * @Description * @author admin * @created 2015年6月29日 下午3:43:15 * @version * @history * @see */ public class User { public String username; public Str

json学习系列(7)JSONBuilder的用法

JSONBuilder可以向文件中写入写入json字符串.如下面的例子: public class Test { public static void main(String args[]) throws IOException { File f = new File("d:" + File.separator + "test.txt"); FileWriter fw = new FileWriter(f); JSONBuilder builder = new JS

json学习系列(6)JSONObject和JSONArray是JDK的集合部分延伸

我一直觉得JSONObject和JSONArray是JDK集合部分的延伸,它们与JDK的List和Map一脉相承.通过研究JSONObject和JSONArray的结构,我们顺便也复习一下JDK的内容. 首先看一下JSONObject和JSONArray 的结构: final class JSONObject extends AbstractJSON implements JSON, Map, Comparable final class JSONArray extends AbstractJS

json学习系列(1)-使用json所要用到的jar包下载

内容来源于互联网. json是个非常重要的数据结构,在web开发中应用十分广泛.每个开发者都应该好好的去研究一下json的底层实现.在使用json之前首先要明白需要哪些jar文件,初次使用的时候很容易犯错,如果没有加入正确的jar包,会报各种各样的问题.在使用json之前需要准备下面的六个jar 包: commons-lang-1.0.4.jar commons-collections-2.1.jar commons-beanutils-1.8.0.jar json-lib-2.4.jar ez

python学习笔记8--面向对象--属性和方法详解

属性: 公有属性  (属于类,每个类一份) 普通属性  (属于对象,每个对象一份) 私有属性    (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法:(按类型) 普通方法 私有方法(方法前面加两个下划线) 静态方法 类方法 属性方法 静态方法 @staticmethod静态方法,通过类直接调用,不需要创建对象,不会隐式传递self 类方法 @classmethod类方法,方法中的self是类本身,调用方法时传的值也必须是类的公有属性,就是说类方法