Gson解析json

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

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

2.3k
WilliamChart:轻量美观的 Android 图表库实战
精选开源

WilliamChart:轻量美观的 Android 图表库实战

WilliamChart:轻量美观的 Android 图表库实战数据可视化是运动、健康、金融、统计类 App 的刚需。MPAndroidChart 功能最全但偏重复杂,WilliamChart 走的则是"轻量 + 美观 + Kotlin 原生"路线——v3 用 Kotlin 完全重写,API 极简,一行 chart.animate(dataSet) 就能把数据画成带动画的折线/柱状/环形图,开箱即

175
sherpa解析:开源语音技术全家桶
精选开源

sherpa解析:开源语音技术全家桶

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双…

44