Gson解析json

QuibblerQuibbler 2020-01-23 约 8 分钟 1833 次阅读

Gson解析json


1、JSON

json数据不用再多说了,轻量级的数据传输交换。普遍应用于移动端和服务端的数据获取。比XML解析速度更快速,更省电。在Android中可以借助JSONObject和JSONArray解析json数据,还可以借助第三方工具快速解析如谷歌的GSON、阿里巴巴的fastjson。

GitHub:google/gson

2、基本用法


2.1、依赖

首先,使用Gson要在build.gradle中配置依赖:

dependencies {
      implementation 'com.google.code.gson:gson:2.8.6'
    }

2.2、fromJson

创建JavaBean类,配合GSON解析数据。举个例子,要解析如下的json串:

String jsonStr = 
    {
        "name":Quibbler,
        "age":96
    };

就需要在对应的JavaBean类中添加所需解析的字段,不需要添加setter和getter方法:

public class JsonBean {
        private int age;
        private String name;
    }

配合Json接解析json数据

//构造函数创建Gson对象
    Gson gson = new Gson();
    //借助GSONBuilder可以进行配置
    Gson gson = new GsonBuilder().create();
    JsonBean jsonBean = gson.fromJson(jsonStr, JsonBean .class);

2.3、toJson

任何Object对象都可以转换成对应的Json数据,Gson对象调用toJson(Object src)方法即可返回String类型的Json结果:

String jsonStr= gson.toJson(object);

3、使用技巧

3.1、Json字段别名

有时候会遇到json中的字段数字开头,或者较复杂写成JavaBean不太符合命名规范,可以使用@SerializedName创建字段别名,Gson会更具这个别名去解析JSON:

{
        "1":10096,
        "2":1881134
    }

要想解析上面的就不可能创建名为1的java变量,就要用到@SerializedName指定变量别名:

@SerializedName(value = "1")
    private int age;
    
    @SerializedName("2")
    private double salary;

还支持备用可选别名,alternate = {}

@SerializedName(value = "1", alternate = {"age", "ages"})
    private int age;

3.1、解析Json数组

解析JSON数组稍微复杂一些,不过步骤一样,一般JSON中的[]数组转成Java中的List<>对象。类型通过:

new TypeToken<List<?>>(){}.getType())

String json = [
    "apple",
    "pear",
    "banana"];

转换成List<String>对象,其它类型的对象数组也可以这样解析。

Gson gson = new Gson();
    // 传入的java类型是new TypeToken<List<String>>(){}.getType()
    List<String> fruitList = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());

还可以直接转换成String[]数组:

Gson gson2 = new Gson();
    // 传入的java类型是String[].class
    String[] fruits = gson2.fromJson(json2, String[].class);

4、更复杂的JSON

        实际上服务端传来的JSON数据没有那么简单,数千行很复杂。可以用插件一键根据Json帮助开发者生成Json对应的Bean类,参考《GsonFormat插件:一键生成Json bean》。

{
        "result":{
            "songs":Array[30],//此处折叠数千行
            "songCount":332
        },
        "code":200
    }

         越复杂的Json对应的JavaBean也就会更复杂。不需要解析全部字段 ,只解析需要的数据字段即可。万变不离其宗,无非就两种JsonObject和JsonArray。逐层分析Json数据,再按顺序写出来,JavaBean也不会太乱:

        最外层的两个JsonObect:result和int类型的code

        result对象里面有嵌套了:JsonArray数组songs和int类型的songCount

        .... .... 

public class MusicBean {
        private int code;
        private Result result;
        private static class Result{
            private List<Song> songs;
            private int songCount;
        }
        private static class Song{
            //... ...
        }
        
    }

参考资料:

        git/google/gson

        json.cn

      《gson解析对象数组,使用泛型封装报错》

      《Android Gson使用详解》

相关推荐

精选
Airbnb开源项目
开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k