Android网络编程之JSON解析

1.JSON的概念

JSON,即JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。
具有如下特点:
(1)易于人阅读和编写。
(2)易于机器解析和生成(网络传输速率)。
因此网络上传输数据经常用到它。

2.JSON的语法

要解析JSON,那么,熟悉JSON的语法还是很有必要的。

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在键值对中
  • 键与值冒号分隔
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

JSON示例

{
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Jason",
        "lastName": "Hunter",
        "email": "bbbb"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Tad",
        "lastName": "Williams",
        "genre": "fantasy"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
}

3.解析JSON的常用工具

(1)为了确保JSON数据是符合语法规则的。在获取到JSON数据后,我们可以先验证其合法性。验证网站很多。

比如:JSON合法性验证
还有:JSON各种操作

(2)JSON解析常用两个框架

  • Gson
  • Jackson
  • fastjson

如果数据量非常大,推荐使用Jackson或fastjson。

jar包百度云下载地址:Gson、Jackson和fastjson相关jar包百度云下载地址

4.Android Studio使用Gson解析JSON

Android Studio中使用Gson前可以先安装GsonFormat插件。

步骤如下:

  • 首先,下载Gson.jar包。
  • 然后,将Gson.jar包复制到工程app模块目录下的libs文件夹下。
  • 右键jar包,选择Add as Library…,点击ok。
  • 准备带解析的JSON字符串(通常情况下是网络获取,此处直接创建)。
  • 使用GsonFormat插件将JSON字符串生成实体类。
  • 最后,使用Gson解析JSON字符串为实体类对象。

GsonFormat插件安装

打开File->Settings…->Plugins->Browse repositories…->搜索GsonFormat->选中->install->重启Android Studio。

JSON字符串示例

{
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Jason",
        "lastName": "Hunter",
        "email": "bbbb"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Tad",
        "lastName": "Williams",
        "genre": "fantasy"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
}

GsonFormat使用说明

  • 复制JSON字符串内容;
  • 新建一个空类,这里命名为Bean.java;
  • 将光标放到空类中,使用快捷键Alt+Insert,选择GsonFormat。
  • 弹出对话框,点击setting,勾选reuse entity,ok,粘贴JSON字符串内容,ok,ok;

生成实体类示例(为了方便展示,这里添加了toString()方法)

package gson.example.com.gsontest;

import java.util.List;

/**
 * Created by Zz on 2015/9/9.
 */
public class Bean {

    /**
     * programmers : [{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]
     * authors : [{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}]
     * musicians : [{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]
     */

    private List<ProgrammersEntity> programmers;
    private List<AuthorsEntity> authors;
    private List<MusiciansEntity> musicians;

    public void setProgrammers(List<ProgrammersEntity> programmers) {
        this.programmers = programmers;
    }

    public void setAuthors(List<AuthorsEntity> authors) {
        this.authors = authors;
    }

    public void setMusicians(List<MusiciansEntity> musicians) {
        this.musicians = musicians;
    }

    public List<ProgrammersEntity> getProgrammers() {
        return programmers;
    }

    public List<AuthorsEntity> getAuthors() {
        return authors;
    }

    public List<MusiciansEntity> getMusicians() {
        return musicians;
    }

    public static class ProgrammersEntity {
        /**
         * firstName : Brett
         * lastName : McLaughlin
         * email : aaaa
         */

        private String firstName;
        private String lastName;
        private String email;

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public String getEmail() {
            return email;
        }

        @Override
        public String toString() {
            return "ProgrammersEntity{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }

    public static class AuthorsEntity {
        /**
         * firstName : Isaac
         * lastName : Asimov
         * genre : sciencefiction
         */

        private String firstName;
        private String lastName;
        private String genre;

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public void setGenre(String genre) {
            this.genre = genre;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public String getGenre() {
            return genre;
        }

        @Override
        public String toString() {
            return "AuthorsEntity{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", genre='" + genre + '\'' +
                    '}';
        }
    }

    public static class MusiciansEntity {
        /**
         * firstName : Eric
         * lastName : Clapton
         * instrument : guitar
         */

        private String firstName;
        private String lastName;
        private String instrument;

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public void setInstrument(String instrument) {
            this.instrument = instrument;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public String getInstrument() {
            return instrument;
        }

        @Override
        public String toString() {
            return "MusiciansEntity{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", instrument='" + instrument + '\'' +
                    '}';
        }
    }

    @Override
    public String toString() {
        return "Bean{" +
                "programmers=" + programmers +
                ", authors=" + authors +
                ", musicians=" + musicians +
                '}';
    }
}

Gson解析代码示例

    private void convertJson() {
        String json_str = "{\n" +
                "    \"programmers\": [{\n" +
                "        \"firstName\": \"Brett\",\n" +
                "        \"lastName\": \"McLaughlin\",\n" +
                "        \"email\": \"aaaa\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Jason\",\n" +
                "        \"lastName\": \"Hunter\",\n" +
                "        \"email\": \"bbbb\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Elliotte\",\n" +
                "        \"lastName\": \"Harold\",\n" +
                "        \"email\": \"cccc\"\n" +
                "    }],\n" +
                "    \"authors\": [{\n" +
                "        \"firstName\": \"Isaac\",\n" +
                "        \"lastName\": \"Asimov\",\n" +
                "        \"genre\": \"sciencefiction\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Tad\",\n" +
                "        \"lastName\": \"Williams\",\n" +
                "        \"genre\": \"fantasy\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Frank\",\n" +
                "        \"lastName\": \"Peretti\",\n" +
                "        \"genre\": \"christianfiction\"\n" +
                "    }],\n" +
                "    \"musicians\": [{\n" +
                "        \"firstName\": \"Eric\",\n" +
                "        \"lastName\": \"Clapton\",\n" +
                "        \"instrument\": \"guitar\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Sergei\",\n" +
                "        \"lastName\": \"Rachmaninoff\",\n" +
                "        \"instrument\": \"piano\"\n" +
                "    }]\n" +
                "}";
        Gson gson = new Gson();
        try {
            Bean bean = gson.fromJson(json_str, Bean.class);
            Log.i("TAG", bean.toString());
        }catch (JsonSyntaxException e) {
            e.printStackTrace();
        }

    }

Gson解析结果示例

09-09 13:59:28.728    4688-4688/? I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}

5.Android Studio使用Jackson解析JSON

步骤如下:

  • 首先,下载jar包;
  • 使用上面的工程;
  • 导入jackson.jar包;
  • 使用上面工程中的JSON字符串;
  • 使用上面工程生成的实体类Bean;
  • 使用Jackson进行解析。

注意:使用该jar包需要在app模块下的build.gradle中的android{}中添加如下代码:

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

否则,编译过程会报错。

JSON字符串还是上面的字符串

实体类也还是上面的实体类

Jackson解析代码示例

    private void jacksonConvertJson() {
        String json_str = "{\n" +
                "    \"programmers\": [{\n" +
                "        \"firstName\": \"Brett\",\n" +
                "        \"lastName\": \"McLaughlin\",\n" +
                "        \"email\": \"aaaa\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Jason\",\n" +
                "        \"lastName\": \"Hunter\",\n" +
                "        \"email\": \"bbbb\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Elliotte\",\n" +
                "        \"lastName\": \"Harold\",\n" +
                "        \"email\": \"cccc\"\n" +
                "    }],\n" +
                "    \"authors\": [{\n" +
                "        \"firstName\": \"Isaac\",\n" +
                "        \"lastName\": \"Asimov\",\n" +
                "        \"genre\": \"sciencefiction\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Tad\",\n" +
                "        \"lastName\": \"Williams\",\n" +
                "        \"genre\": \"fantasy\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Frank\",\n" +
                "        \"lastName\": \"Peretti\",\n" +
                "        \"genre\": \"christianfiction\"\n" +
                "    }],\n" +
                "    \"musicians\": [{\n" +
                "        \"firstName\": \"Eric\",\n" +
                "        \"lastName\": \"Clapton\",\n" +
                "        \"instrument\": \"guitar\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Sergei\",\n" +
                "        \"lastName\": \"Rachmaninoff\",\n" +
                "        \"instrument\": \"piano\"\n" +
                "    }]\n" +
                "}";
        ObjectMapper mapper = new ObjectMapper();
        try {
            Bean bean = mapper.readValue(json_str, Bean.class);
            Log.i("TAG", bean.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Jackson解析结果

09-09 15:10:39.818  31472-31472/gson.example.com.gsontest I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}

6.Android Studio使用fastjson解析JSON

步骤如下:

  • 首先,下载jar包;
  • 使用上面的工程;
  • 导入fastjson.jar包;
  • 使用上面工程中的JSON字符串;
  • 使用上面工程生成的实体类Bean;
  • 使用fastjson进行解析。

JSON字符串还是上面的字符串

实体类也还是上面的实体类

fastjson解析代码示例

    private void fastjsonConvertJson() {
        String json_str = "{\n" +
                "    \"programmers\": [{\n" +
                "        \"firstName\": \"Brett\",\n" +
                "        \"lastName\": \"McLaughlin\",\n" +
                "        \"email\": \"aaaa\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Jason\",\n" +
                "        \"lastName\": \"Hunter\",\n" +
                "        \"email\": \"bbbb\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Elliotte\",\n" +
                "        \"lastName\": \"Harold\",\n" +
                "        \"email\": \"cccc\"\n" +
                "    }],\n" +
                "    \"authors\": [{\n" +
                "        \"firstName\": \"Isaac\",\n" +
                "        \"lastName\": \"Asimov\",\n" +
                "        \"genre\": \"sciencefiction\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Tad\",\n" +
                "        \"lastName\": \"Williams\",\n" +
                "        \"genre\": \"fantasy\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Frank\",\n" +
                "        \"lastName\": \"Peretti\",\n" +
                "        \"genre\": \"christianfiction\"\n" +
                "    }],\n" +
                "    \"musicians\": [{\n" +
                "        \"firstName\": \"Eric\",\n" +
                "        \"lastName\": \"Clapton\",\n" +
                "        \"instrument\": \"guitar\"\n" +
                "    }, {\n" +
                "        \"firstName\": \"Sergei\",\n" +
                "        \"lastName\": \"Rachmaninoff\",\n" +
                "        \"instrument\": \"piano\"\n" +
                "    }]\n" +
                "}";
        Bean bean = JSON.parseObject(json_str, Bean.class);
        if (bean != null) {
            Log.i("TAG", bean.toString());
        }
    }

fastjson解析结果

22:28:05.060  20202-20202/gson.example.com.gsontest I/TAG﹕ Bean{programmers=[ProgrammersEntity{firstName='Brett', lastName='McLaughlin', email='aaaa'}, ProgrammersEntity{firstName='Jason', lastName='Hunter', email='bbbb'}, ProgrammersEntity{firstName='Elliotte', lastName='Harold', email='cccc'}], authors=[AuthorsEntity{firstName='Isaac', lastName='Asimov', genre='sciencefiction'}, AuthorsEntity{firstName='Tad', lastName='Williams', genre='fantasy'}, AuthorsEntity{firstName='Frank', lastName='Peretti', genre='christianfiction'}], musicians=[MusiciansEntity{firstName='Eric', lastName='Clapton', instrument='guitar'}, MusiciansEntity{firstName='Sergei', lastName='Rachmaninoff', instrument='piano'}]}

7.Eclipse使用Gson解析JSON

  • 首先,下载Gson的jar包。
  • 然后,新建一个Eclipse工程,这里我命名为TestGson。
  • 将Gson.jar包复制到工程libs目录下。
  • 将获取到的JSON字符串准备好。
  • 根据JSON字符串写出对应的实体类(Java Bean)。
  • 最后,使用Gson解析JSON字符串为实体类对象。

用法和Android Studio一样,不过实体类需要手写。

8.Eclipse使用Jackson解析JSON

  • 首先,下载Jackson的三个jar包。
  • 然后,新建一个Eclipse工程,这里我命名为TestJackson。
  • 将Jackson的三个jar包复制到工程libs目录下。
  • 将获取到的JSON字符串准备好。
  • 根据JSON字符串写出对应的实体类(Java Bean)。
  • 最后,使用Jackson解析JSON字符串为实体类对象。

用法和Android Studio一样,不过实体类需要手写。

9.Eclipse使用fastjson解析JSON

  • 首先,下载fastjson的jar包。
  • 然后,新建一个Eclipse工程,这里我命名为TestFastJson。
  • 将fastjson.jar包复制到工程libs目录下。
  • 将获取到的JSON字符串准备好。
  • 根据JSON字符串写出对应的实体类(Java Bean)。
  • 最后,使用fastjson解析JSON字符串为实体类对象。

用法和Android Studio一样,不过实体类需要手写。

10.总结

Gson,Jackson和fastjson三种框架解析JSON使用的代码都很简洁。
但是他们的性能还是有差别的。
根据网上说法,数据量较大时,解析速度应该是fastjson>Jackson>Gson。而且数据越大,差距越明显。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值