JSON解析的成长史——原来还可以这么简单

简介: 本文系统介绍,JSON解析的成长史,未经允许,禁止转载。 JSON是一种轻量级的数据格式,一般用于数据交互Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。目录[一、使用原生方式解析Json](## 一、使用原生方式解析Json) [二 、Gso

本文系统介绍,JSON解析的成长史,未经允许,禁止转载。
JSON是一种轻量级的数据格式,一般用于数据交互

Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。

目录

[一、使用原生方式解析Json](## 一、使用原生方式解析Json)
[二 、Gson框架的使用](##二 、Gson框架的使用)
[三 、插件GsonFormat快速实现JavaBean](##三 、插件GsonFormat快速实现JavaBean)

一、使用原生方式解析Json

Json主要通过”{ }” 和 “[ ]” 包裹数据,”{ }”里面存放key-value键值对, “[ ]” 里存放数组。
标准的Json格式key必须用双引号。 下面都是Json:

 {"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

要想从JSON中挖掘出具体数据,得对JSON进行解析。分别来看看三个不同的Json是如何解析的:

public void parseJson1(){
        String json1="{\"name\" : \"jack\", \"age\" : 10}";
        try {
            //把要解析的json通过构造方法告诉JSONObject
            JSONObject jsonObject=new JSONObject(json1);
            // 获取name
            String name=jsonObject.getString("name");
            int age=jsonObject.getInt("age");
            Log.i("ParserJsonActivity","name:"+name);
            Log.i("ParserJsonActivity","age:"+age);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void parseJson2(){
        String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
        try {
            //把要解析的json通过构造方法告诉JSONObject
            JSONObject jsonObject=new JSONObject(json2);
            //names对应的 JsonArray
            JSONArray jsonArray=jsonObject.getJSONArray("names");
            //遍历JSONArray
            for(int i=0;i<jsonArray.length();i++){
                Log.i("ParserJsonActivity","name"+i+":"+jsonArray.getString(i));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void parseJson3(){
        String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
        try {
            //把要解析的json通过构造方法告诉JSONArray
            JSONArray jsonArray=new JSONArray(json3);
            //遍历JSONArray
            for(int i=0;i<jsonArray.length();i++){
                //根据i的位置获取JSONObject
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.getString("name");
                int age=jsonObject.getInt("age");
                Log.i("ParserJsonActivity","name"+i+":"+name);
                Log.i("ParserJsonActivity","age"+i+":"+age);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

上面的代码,主要使用了JSONObject和JSONArray。
用Android原生的Api有一句真理,别问我怎么知道的,很难:

当碰到 “{ }”时用JSONObject解析,遇到“[ ]”时用JSONArray解析。

分别运行下三个方法,看看结果:
这里写图片描述

想要的数据全部都获取到了。

二 、Gson框架的使用

如果你认为使用JSONObject和JSONArray来解析JSON数据已经非常简单了,那你就容易太满足了。早就有框架可以使用了。

常见的框架有 Gson,Jackson等等,他们都各有优缺点,但是总体区别不大。

GSON方式
* 原理:基于事件驱动
* 优点:解析方法简单、解析效率高、占存少、灵活性高
* 使用情境:适用于需要处理大型 JSON文档、JSON文档结构复杂的场合

Jackson方式
* 原理:基于事件驱动
* 优点:解析效率最高、在数据量大的情况优势尤为明显、占存少
* 缺点:必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;
* 使用情境: 适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、性能要求较高的场合

我一直用GSON方式解析,使用起来比较简单。
首先在app/build.gradle中添加依赖。

dependencies {
    ...
    compile 'com.google.code.gson:gson:2.6.2'
}

Gson是基于事件驱动,根据所需要取的数据通过建立一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:
* JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名;
* JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组或者集合,数据里面可以有值或者对象;
* 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名;
* 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key。

注意:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应。

接下来,我们来看下下面两条JSON数据按照上面的规则应该何如生成JavaBean对象。

{"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

第一个:

/**
 * {"name" : "jack", "age" : 10}
 */
public class Person1 {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

第二个:

/**
 * {"names" : ["jack", "rose", "jim"]}
 */
public class Person2 {

    private List<String> names;

    public List<String> getNames() {
        return names;
    }

    public void setNames(List<String> names) {
        this.names = names;
    }
}

再来看看使用如何Gson解析:
主要方法为:fromJson()

public  void  useGsonParser1(){
    String json1="{\"name\" : \"jack\", \"age\" : 10}";
    Gson gson=new Gson();
    //把json数据解析成Person1对象
    Person1 person1 = gson.fromJson(json1, Person1.class);
    Log.i("UseGsonActivity","name:"+person1.getName());
    Log.i("UseGsonActivity","age:"+person1.getAge());
}
public  void  useGsonParser2(){
    String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
    Gson gson=new Gson();
    Person2 person2=gson.fromJson(json2,Person2.class);
    List<String> names = person2.getNames();
    for(int i=0;i<names.size();i++){
        Log.i("UseGsonActivity","name"+i+":"+names.get(i));
    }
}

细心的同学会发现,之前使用JSONObject和JSONArray解析了3条数据,而我们并没有使用GSON解析最后一条。

[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

最后一条比较特殊,是以”[ ]”开头,我们知道因为大括号{ } 代表的是对象,中括号[]代表的是集合或者数组,所以javaBean直接使用Person1就行了,只不过返回的是一个集合或者数组。我们需要借助TypeToken,具体代码如下:

public  void useGsonParser3(){
    String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
    Gson gson=new Gson();
    List<Person1> person2=gson.fromJson(json3,new TypeToken<ArrayList<Person1>>(){}.getType());
    for(int i=0;i<person2.size();i++){
        //根据i的位置获取JSONObject
        Person1 person1 = person2.get(i);
        String name = person1.getName();
        int age=person1.getAge();
        Log.i("UseGsonActivity","name"+i+":"+name);
        Log.i("UseGsonActivity","age"+i+":"+age);
    }
}

调用上面的三段代码来看看运行结果:

这里写图片描述
想要的数据依然全部都获取到了。
上面的Gson介绍,基本上可以满足绝大多数的开发需求。

三 、插件GsonFormat快速实现JavaBean

上面我们介绍了,使用Gson开源库解析JSON数据,大家可能会发现虽然解析代码比较简单,但是还需要自己按照规则写一个javaBean。

好消息来了,通过AndroidStudio插件,你甚至不需要再手动写JavaBean了,让你Biubiubiu的立刻完成~

首先需要安装GsonFormat ,安装方式:
1. Android Studio File->Settings..->Plugins–>Browse repositores..搜索GsonFormat
2. 安装插件,重启Android Studio。

这里写图片描述
重启完了,接下来就是见证奇迹的时刻了。
我们以下面的JSON为例,让大家看看如何快速生成JavaBean:

{
  "showapi_res_code": 0,
  "showapi_res_error": "",
  "showapi_res_body": {
    "areaCode": "0871",
    "city": "昆明",
    "name": "中国电信",
    "num": 1890871,
    "postCode": "650000",
    "prov": "云南",
    "provCode": "530000",
    "ret_code": 0,
    "type": 2
  }
}

使用方式,在实体类中使用Generate的快捷键。默认快捷键 alt+Insert。

这里写图片描述
选择GsonFormat
这里写图片描述

把JSON数据粘贴进去。然后联系点击OK,就会自动生成想要的JavaBean。

这里写图片描述
动态效果图:
这里写图片描述
使用GsonFormat可以极大的提高开发的效率,有木有一种如沐春风的感觉啊。

更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

这里写图片描述

相关文章
|
19天前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
3月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
20天前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
4月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
155 67
|
7月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
439 4
JSON数据解析实战:从嵌套结构到结构化表格
|
9月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
9月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1280 12
|
9月前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
282 12
|
10月前
|
JSON JavaScript 前端开发
一次采集JSON解析错误的修复
两段采集来的JSON格式数据存在格式问题,直接使用PHP的`json_decode`会报错。解决思路包括:1) 手动格式化并逐行排查错误;2) 使用PHP-V8JS扩展在JavaScript环境中解析。具体方案一是通过正则表达式和字符串替换修复格式,方案二是利用V8Js引擎执行JS代码并返回JSON字符串,最终实现正确解析。 简介: 两段采集的JSON数据因掺杂JavaScript代码导致PHP解析失败。解决方案包括手动格式化修复和使用PHP-V8JS扩展在JavaScript环境中解析,确保JSON数据能被正确处理。
|
12月前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:

热门文章

最新文章

推荐镜像

更多
  • DNS