JSON之JSONArray的使用

引言

     之前已经写过一篇关于JSON使用的文章了,不过只能算是简单的入门罢了,里面的数据结构比较简单,但是在开发中,有时从服务器得到的JSON不是那么简单的,像是下面的内容:

{"type_id":10001,"type_name":["jack","tom","alen","naruto"],"data":1}

     我们可以看到,type_name对应的数据不是一个简单的值,而是一个数组,那么我们该怎么操作呢?


实现

      我刚开始确实一点都不会操作,虽然知道应该用JSONArray类来帮助实现,但是确实没怎么用过它,所以还是不会,找了许多的资料才知道该怎么使用它,代码真的很简单,但是不了解的人还是不能轻易的使用。

源码

public class MainActivity extends Activity {

    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        String jsString = "{\"type_id\":10001,\"type_name\":[\"jack\",\"tom\",\"alen\",\"naruto\"],\"data\":1}";
        try {
            JSONObject object = new JSONObject(jsString);
            JSONArray array = object.getJSONArray("type_name");
            StringBuilder sb = new StringBuilder();
            for(int i=0;i<array.length();i++)
                sb.append(array.optString(i)).append("\n");
            text.setText(sb.toString());
        } catch (JSONException e) {}
    }
}

效果图

这里写图片描述

分析

 从代码中,我们可以很清楚的看到,我们调用JSONObject的getJSONArray()方法来得到JSONArray的对象,传入的参数就是type_name,然后就可以得到了,我们调用JSONArray的optString()方法就可以得到数组里面的内容。
      这种用法还是比较使用的,当我们需要查询的内容不是一个值而是一组值的时候,这种用法就可以派上用处了,当然具体的操作还是需要大家自己去挖掘了。

附件

      下载源码

大家有什么不懂的,欢迎大家和我交流^_^!
<think> 我们需要将原代码中使用com.alibaba.fastjson.JSONArray替换为org.json.JSONArray。注意两个库的API有所不同,主要区别在于: 1. 创建JSONArray:org.json.JSONArray的构造方法可直接传入字符串,而fastjson是调用JSONArray.parseArray。 2. 获取元素:org.json.JSONArray使用getJSONObject(index)获取JSONObject,而fastjson使用getJSONObject(index)或直接转换为JSONObject。 3. 遍历方式:org.json.JSONArray没有直接转换为List<JSONObject>的方法,需要循环获取。 具体修改点: 原代码中使用了com.alibaba.fastjson.JSONArrayJSONObject,现在需要改为使用org.json.JSONArray和org.json.JSONObject。 需要修改的方法:searchContent 原代码片段: String json = OkHttp.string(url, getHeader()); JSONArray objects = JSONArray.parseArray(json); for (int j = 0; j < objects.size(); j++) { JSONObject vod = (JSONObject) objects.get(j); ... } 改为org.json.JSONArray后: JSONArray objects = new JSONArray(json); for (int j = 0; j < objects.length(); j++) { JSONObject vod = objects.getJSONObject(j); ... } 同时注意:org.json.JSONObject获取字符串的方法为getString,与fastjson一致,所以可以直接替换。 另外,其他方法中是否使用了fastjson?目前从代码中看只有searchContent使用了。所以主要修改这个方法。 但是,我们还要注意,原代码中可能在其他地方也使用了fastjson,但根据提供的代码,只有searchContent方法使用了。所以只修改这个方法即可。 修改后的searchContent方法代码如下: </think> 以下是使用 `org.json.JSONArray` 替换原有 FastJSON 实现的代码修改方案。主要修改集中在 `searchContent` 方法,使其兼容 `org.json` 库的 API: ```java package com.github.catvod.spider; // 其他导入保持不变... import org.json.JSONArray; import org.json.JSONObject; // 替换FastJSONJSONObject public class CeChi extends Spider { // ... 其他代码保持不变 ... @Override public String searchContent(String key, boolean quick) throws Exception { String url = searchUrl + URLEncoder.encode(key); String json = OkHttp.string(url, getHeader()); // 使用org.json.JSONArray解析 JSONArray objects = new JSONArray(json); List<Vod> list = new ArrayList<>(); for (int j = 0; j < objects.length(); j++) { JSONObject vod = objects.getJSONObject(j); // 使用getJSONObject方法 String vid = siteUrl + vod.getString("url"); String name = vod.getString("title"); String pic = vod.getString("thumb"); String remark = vod.getString("area"); list.add(new Vod(vid, name, pic, remark)); } return Result.string(list); } // ... 其他方法保持不变 ... } ``` ### 关键修改说明: 1. **导入包替换**: ```java import org.json.JSONArray; import org.json.JSONObject; // 替换FastJSON ``` 2. **JSON解析方式变更**: ```java // 原FastJSON方式 // JSONArray objects = JSONArray.parseArray(json); // org.json方式 JSONArray objects = new JSONArray(json); ``` 3. **元素获取方式**: ```java // 原FastJSON方式 // JSONObject vod = (JSONObject) objects.get(j); // org.json方式 JSONObject vod = objects.getJSONObject(j); ``` 4. **数据读取一致性**: ```java // org.json的getString方法保持与FastJSON相同的API vod.getString("url"); vod.getString("title"); ``` ### 两种JSON库的主要差异对比: | 特性 | FastJSON | org.json | |---------------------|------------------------------|------------------------------| | JSON数组解析 | `JSONArray.parseArray(json)` | `new JSONArray(json)` | | 获取JSON对象 | `(JSONObject) array.get(i)` | `array.getJSONObject(i)` | | 空值处理 | 自动转换空字符串 | 可能抛出JSONException | | 性能 | 较高(尤其序列化) | 中等 | | Android兼容性 | 需要额外依赖 | Android系统内置支持 | ### 注意事项: 1. **异常处理**: ```java try { JSONArray objects = new JSONArray(json); } catch (JSONException e) { // 处理非法JSON格式 } ``` 2. **空值安全**: ```java // 建议增加空值检查 String pic = vod.optString("thumb", ""); // 使用optString避免异常 ``` 3. **依赖管理**: 在 `build.gradle` 中添加依赖(如未内置): ```gradle implementation 'org.json:json:20231013' ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值