Android中解析JSON数据

本文介绍了JSON的基本概念及其在Android开发中的应用。通过实例演示了使用JSONObject、GSON和Fastjson三种方式解析JSON数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Json 介绍

Json 是一种文本形式的数据交换格式,比起 XML,JSON 的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观

使用 JSONObject 解析 Json

解析 Json 数据也有很多种方法,可以使用官方提供的 JSONObject,也可以使用谷歌的开源库 GSON。另外,一些第三方的开源库如 Jackson、FastJSON 等也非常不错。这里先来学习JSONObject

之前的章节中我们安装了 Tomcat,如果不了解可以学习:Tomcat安装。在 downloads 文件夹下放入 data.json 文件,并加入如下 JSON 格式的内容:

[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"7.0","name":"Clash of Clans"},
{"id":"7","version":"3.5","name":"Hey Day"}]

这时在浏览器中访问 http://127.0.0.1:8080/downloads/data.json
在这里插入图片描述
以下代码是基于 HttpURLConnection 这篇文章进行的修改,这里我们重点关注如何解析 json 即可

修改 MainActivity 中的代码

private void sendRequestWithURLConnection() {
        //开启线程发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
             		URL url = new URL("http://192.168.3.208:8080/downloads/data.json");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream inputStream = connection.getInputStream();
                    //对获取的输入流进行读取
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder response = new StringBuilder();

                    String line;
                    while ((line = reader.readLine()) != null) {
                        response.append(line);
                    }
                    parseJSONWithJSONObject(response.toString());

                } catch (MalformedURLException e) {

                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseJSONWithJSONObject(String jsonData){

        try {
            JSONArray jsonArray = new JSONArray(jsonData);
            for(int i=0;i<jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                String version = jsonObject.getString("version");

                Log.d("MainActivity", "id is " + id);
                Log.d("MainActivity", "name is " + name);
                Log.d("MainActivity", "version is " + version);
            }
        } catch (JSONException e) {

        }

    }

首先记得要将 HTTP 请求的地址改成自己的 ip(查看电脑ip

然后在得到了服务器返回的数据后调用 parseJSONWithJSONObject() 方法来解析数据

解析 JSON的 代码真的是非常简单,由于我们在服务器中定义的是一个 JSON 数组,因此这里首先是将服务器返回的数据传入到了一个 JSONArray 对象中。然后循环遍历这个 JSONArray,从中取出的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、name 和 version这些数据

接下来只需要调用 getString() 方法将这些数据取出,并打印出来即可
在这里插入图片描述

使用 GSON 解析 Json

GSON 是 Google 开发的 Java API,用于转换 Java 对象和 Json 对象。Gson Github主页

使用
在项目的 build.gradle 中添加依赖

implementation 'com.google.code.gson:gson:2.8.5'

那么 GSON 库究竟是神奇在哪里呢?其实它主要就是可以将一段 JSON 格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析了

比如说一段 JSON格式的数据如下所示:

{"name":"Tom","age":20}

那我们就可以定义一个 Person 类,并加入 name 和 age 这两个字段,然后只需简单地调用如下代码就可以将 JSON 数据自动解析成一个 Person 对象了:

Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class); 

如果需要解析的是一段 JSON 数组会稍微麻烦一点,我们需要借助 TypeToken 将期望解析成的数据类型传入到 fromJson()方法中,如下所示:

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());

好了,基本的用法就是这样,下面就让我们来真正地尝试一下吧

首先新增一个 App 类,并加入 id、name 和 version 这三个字段,如下所示:

public class App {
    private String id;
    private String name;
    private String version;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

然后修改 MainActivity 中的代码:

	//调用解析方法时,把 parseJSONWithJSONObject(response.toString()); 改为 parseJSONWithGSON(response.toString());
	//parseJSONWithJSONObject(response.toString());
    parseJSONWithGSON(response.toString());

    private void parseJSONWithGSON(String jsonData){
        Gson gson = new Gson();
        List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType());

        for(App app:appList){
            Log.d("MainActivity","id is "+app.getId());
            Log.d("MainActivity","name is "+app.getName());
            Log.d("MainActivity","version is "+app.getVersion());
        }
    }

运行结果相同

学习更多:Android Gson使用详解

Fastjson

FastJson 是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,Fastjson Github地址

Fastjson 提供了两种版本:标准版本,Android 版本,所以添加 Gradle 依赖也有所不同
两个版本区别可以查看文档

# 标准版
implementation 'com.alibaba:fastjson:1.2.55'
# android版
implementation 'com.alibaba:fastjson:1.1.70.android'

我们使用 fastJson 来解析刚才的一段 json 数据

private void parseJSONWithFastJson(String jsonData){
        List<App> list = JSONArray.parseArray(jsonData, App.class);

        for(App app:list){
            Log.d("MainActivity","id is "+app.getId());
            Log.d("MainActivity","name is "+app.getName());
            Log.d("MainActivity","version is "+app.getVersion());
        }
    }

结果和之前是一样的

查看更多

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值