Android之JSON全面深入解析与使用

在安卓开发中 对于json串的解析 是服务器返回的数据极其常见的一种方式, 那么对于json的普通用法在这里就不再做介绍,

下面给介绍的是 json 更深入的 研究

json 的解析工具 分为 两种 一种是 JSON解析 , 一种是 Gson 解析

利用 JSON解析 最常用的 就是 getInt , getString

下面我们就来分析一下 getInt 的 源码

   //getInt源码
  public int getInt(String key) throws JSONException {
        Object object = this.get(key);

        try {
            // 这句代码的含义是 如果是数值类型,则调用intValue(),否则强转成字符串之后调用parserInt方法()
            return object instanceof Number?((Num,ber)object).intValue():Integer.parseInt((String)object);
        } catch (Exception var4) {
            throw new JSONException("JSONObject[" + quote(key) + "] is not an int.");
        }
    }
//getString 源码
 public String getString(String key) throws JSONException {
        Object object = this.get(key);
        //直接判断是否是字符串类型,如果不是,则抛出异常
        if(object instanceof String) {
            return (String)object;
        } else {
            throw new JSONException("JSONObject[" + quote(key) + "] not a string.");
        }
    }

通过 上诉 源码 可以 得出一个 很方便的 结论 就是 可以判断 服务器返回来的json 字段 是属于 什么 类型 可以根据源码 的出

如 getString 源码 中的 这段 代码 

    字段    的实例 是属于   字符串   
 if(object instanceof String) {
            return (String)object;  将该字符串返回 
    } else {  

    否则 可以 做其他 操作

  } 

对于POST请求,传参数时有时会传一个json数据。JSONObject等提供了对应的方法。

  //外层obj对象
        JSONObject obj = new JSONObject();

        //user对象
        JSONObject user = new JSONObject();

        //写入对应属性
        user.put("name","张三");
        user.put("age","18");
        user.put("isMan","男");

        //将user对象写入到外层obj中
        obj.put("user",user);

        System.out.println(obj);
输出结果为 
{"user":{"name":"张三","age":"18","isMan":"男"}}

opt 替代 get

在上面使用中,我们通过getXXX()获取相应值。但是,会发现其局限性很多,尤其是 当没有需要获取的 字段 的时候 很容易就抛异常,

比如

其他类型转字符串类型抛出异常
当需要的字段没有时,抛出异常。

需要我们try…catch去捕获。而optXXX()对此进行了优化。

看一下opt针对如上问题的解决:

JSONObject obj = new JSONObject(json);//最外层的JSONObject对象


        JSONObject user = obj.optJSONObject("user");

        String name = user.optString("name");

        //整形转字符串
        String age = user.optString("age");

        boolean isMan = user.optBoolean("isMan");

        //默认值,如果没有该字段,则会返回默认值
        String sex = user.optString("sex","男");

        System.out.println("name:"+name+"\nage:"+age+"\nisMan:"+isMan+"\nsex:"+sex);


输出结果为 

    name:张三
    age:18
    isMan:true
    sex:男

使用optString()可以将整形转化为字符串。而对于sex,因为该字段没有,会为其付默认值。解决了抛出异常的问题。

optString的源码

  // optString   默认调用了optString(key, ""); 
    public String optString(String key) {
        return this.optString(key, "");
    }

    //如果是null,返回默认值,否则调用toString方法返回
    public String optString(String key, String defaultValue) {
        Object object = this.opt(key);
        return NULL.equals(object)?defaultValue:object.toString();
    }
   public boolean optBoolean(String key) {
        return this.optBoolean(key, false);
    }

    //实质调用get方法,如果抛出异常,则赋默认值
    public boolean optBoolean(String key, boolean defaultValue) {
        try {
            return this.getBoolean(key);
        } catch (Exception var4) {
            return defaultValue;
        }
    }

json 解析利器 之

GsonFormat: http://blog.csdn.net/q9104422999/article/details/52665182

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值