在安卓开发中 对于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