深入Android JSON原生解析(JSONObject/JSONArray)解析教程

今天是1024了,祝大家程序猿节快乐(ps:工作三年了)

早些时候 移动互联网刚刚兴起的时候,传输数据是通过XML,然后判断XML的Nood节点,易出错,

解析XML有三种:

SAX

SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

Pull解析器:

  Pull解析是一个while循环,随时可以跳出。Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析工作。

扫描二维码关注公众号,回复: 11066272 查看本文章

DOM解析:

  DOM解析XML文件时,会将XML的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。因为DOM需要将所有内容读取到内存中,所以内存的消耗比较大,不建议使用DOM解析XML文件,若文件较小可行。

XML和JSON对比,XML体积更庞大,会有一些无用的Nood点<xml...><...> 传输和发送数据很占用带宽和内存

而JSON应运而生:

{"state":false,"message":"no","data":"0"} 体积小 效率高 易读等

解析JSON的框架有

GSON //Google的

FastJson //阿里巴巴

其他的不常用

原生解析是通过JSONObject

jsonObject = new JSONObject(data);

获取数据首先建立bean类

然后通过getString()/getInt/getDouble或者optString / optDouble等

opt和get的区别是:

get:如果结果字段不存在会抛出一个异常 可能导致程序carsh

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or throws if no such mapping exists.
 *
 * @throws JSONException if no such mapping exists.
 */
public String getString(String name) throws JSONException {
    Object object = get(name);
    String result = JSON.toString(object);
    if (result == null) {
        throw JSON.typeMismatch(name, object, "String");
    }
    return result;
}

opt:如果字段不存在会有个default值

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or the empty string if no such mapping exists.
 */
public String optString(String name) {
    return optString(name, "");
}

调用

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or {@code fallback} if no such mapping exists.
 */
public String optString(String name, String fallback) {
    Object object = opt(name);
    String result = JSON.toString(object);
    return result != null ? result : fallback;
}

如果JSON里面有对象:

可以通过jsonObj.optJSONObject("name");返回一个JSONObject

如果有数组就是optJsonArray(name);

遍历

for (int i = 0; i < jsonArray.length(); i++) {
    //每一条都是JSONObject对象
     JSONObject tempJson = jsonArray.optJSONObject(i);
  //把数据保存到Bean里添加到集合
}

如果返回的JSON有转义字符如\ ,需要将该字段的数据通过String name = json.optString(name);然后JSONObject j1 = new JSONObject(name );

保存数据示例:

data.setTitle(jsonData.optString("Title"));
data.setId(jsonData.optString("Id"));
data.setUid(jsonData.optString("Uid"));

发布了42 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_29769851/article/details/102717971