jsonobject取值key怎么操作?

在程序员开发的过程中,有时候需要jsonobject取值key,这具有很好的参考价值,可是对于新手小白来说jsonobject取值key怎么操作?下面来我们就来给大家讲解一下这方面的内容。

相关代码如下:

//returnContent为获取到的返回参数
System.out.println(returnContent);
//参数转换成json格式
JSONObject jsonObject = JSON.parseObject(returnContent);
//获取json里面的值key(可以省略)
String ErrMsg = jsonObject.getString("ErrMsg");
String passwords = jsonObject.getString("passwords");
//即将要提取的jsonObject的字符串转换为json格式
JSONObject jsonpwd = JSON.parseObject(passwords);
//正式提取未知的key值
IteratorsIterator = jsonpwd.keySet()
    .iterator();
//循环并得到key列表
while (sIterator.hasNext())
{
    // 获得key
    String key = sIterator.next();
    //获得key值对应的value
    String value = jsonpwd.getString(key);
    JSONObject jsonvalue = JSON.parseObject(value);
    String id = jsonvalue.getString("id");
    System.out.println("id: " + id);
}

补充:java 解析json 遍历未知key

import net.sf.json.JSONObject;
String json = "{\"name\":\"lss\"}";
JSONObject jsonObj = JSONObject.fromObject(json);
String name = jsonObj.getString("name");
Iterator it = jsonObj.keys();
ListkeyListstr = new ArrayList();
while (it.hasNext())
{
    keyListstr.add(it.next()
        .toString());
}

JSON解析中获取不存在的key:

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

原来 , 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;
}

其实在任何程序开发过程中,大家只要将逻辑思维整理好,用心写代码,那就什么困难都能解决了!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

fastjson有什么用?fastjson的性能如何?

java架构师要看哪些书?java架构师必看书籍

json文件怎么转换png文件?