关于JSON解析中获取不存在的key问题

目录
  • 1 . fastjson
  • 2 . net.sf.json
  • 3 . org.json

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;
    }

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

(0)

相关推荐

  • java中获取json的所有key方法

    工作笔记(在不知道json的key时如何获取当前json的keys) String json="{'name':'angui','age':'23','like':'吃水果'}"; JSONObject j = JSON.parseObject(json); j.remove("age"); System.out.println(json.toString()); System.out.println(j.toJSONString()); //将json转换为key

  • 全方位解析key值不确定的json数据

    遇到一个奇葩的需求,一段json的key值是动态的,并且这个key还是有作用的.这就要求在不知道key是多少的情况下去把这段json解析出来. 我用到的方法是迭代器. 具体代码如下 JSONObject jsonObject = new JSONObject(jsonData); //通过迭代器获取这段json当中所有的key值 Iterator keys = jsonObject.keys(); //然后通过一个循环取出所有的key值 while (keys.hasNext()){ Strin

  • 获取JsonObject某一未知key的值操作

    我就废话不多说了,大家还是直接看代码吧~ //returnContent为获取到的返回参数 System.out.println(returnContent); //参数转换成json格式 JSONObject jsonObject = JSON.parseObject(returnContent); //获取json里面的值key(可以省略) String ErrMsg = jsonObject.getString("ErrMsg"); String passwords = json

  • 关于JSON解析中获取不存在的key问题

    目录 1 . fastjson 2 . net.sf.json 3 . org.json 1 . fastjson 在fastjson中有些getXXX方法 , 如getString , getInteger , getIntValue等 , 当调用getXXX方法时 , 如果传入的key在json中不存在 , 那调用这些方法会报错抛出异常吗 ? 首先来看代码demo public static void main(String[] args) { String str = "{\"n

  • Java如何从json字符串中获取某个值详解

    目录 Java从json串中获取某个值 使用org.json进行解析 使用com.alibaba.fastjson进行解析 总结 Java从json串中获取某个值 java对象是不能直接传输,只有json对象 转成字符串 可以进行传输 故 传输中都是json进行的 接收到json数据之后java在进行解析转换成为字符串.且json适用于很多语言之间的传输 json本质上就是一个map. 对应有两种json进行解析 首先就是先对json的合法性进行验证 是否可以进行解析 点击这里 进行json解析

  • IOS中Json解析实例方法详解(四种方法)

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

  • 基于JAVA中的四种JSON解析方式详解

    我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 2.GSON 3.FastJSON 4.jackson JSON操作涉及到的类: public class Student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id;

  • Go中JSON解析时tag的使用

    目录 struct成员变量标签(Tag)说明 struct成员变量标签(Tag)获取 自定义tag 在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有反引号括起来的内容.形如: type User struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name&qu

  • mysql解析json数据组获取数据组所有字段的方法实例

    目录 引言 第一步:一行拆分成多行 1.1 新建一张表keyid,只insert从0开始的数字,如下: 1.2 找到拆分标识符 1.3 通过join on拆分多行 第二步:解析json字符串 总结 引言 在开发过程中,遇到过json数据组的字符串,需要解析json组,得到组内所有的信息.如下格式: [{"itemId":3101,"itemName":"空滤器及进气管道"},{"itemId":3102,"itemN

  • Java中Json解析的方法分析

    本文实例讲述了Java中Json解析的方法.分享给大家供大家参考,具体如下: 首先准备一个JSON格式的字符串 * String JsonStr = "{object:{persons:" + "[{name:'呵呵',image:'http://10.0.159.132:8080/Web/s1.png'}," + "{name:'哈哈',image:'http://10.0.159.132:8080/Web/s1.png'}," + "

  • Java解析word,获取文档中图片位置的方法

    前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术,分别是HWPF(.doc)和XWPF(.docx).如果你对这两个技术熟悉的话,就应该能明白使用java解析word文档的痛楚所在. 其中两个最大的问题在于: 第一是这两个类并没有统一的父类和接口(隔壁的XSSF和HSSF投过来鄙视的眼光),所以没法进行同一格式的接口式编程: 第二是官方API中并

  • 在Java代码中解析html,获取其中的值方法

    有时我们获取到了页面需要在Java代码中进行解析,获取html中的数据,Jsoup是一个很方便的工具. 一.什么是Jsoup? 官网网站:http://jsoup.org/ 可在官网下载对应的jar 通俗的将Jsoup就是一个解析网页的东西 二.示例 1.页面,通过查询获取到了一些数据: 2.源码,这是一个table,class="list",通过这些来唯一标识它 3.代码,将html以String的形式传进来,使用Jsoup进行解析: import org.jsoup.Jsoup;

随机推荐