文章目录

  • Gson总结
    • 依赖库
    • 基本API介绍
    • 基本用法
      • 生成Json字符串
      • toJson & fromJson
        • 序列化 toJson
        • 反序列化操作 fromJson
      • Json数组与Java数组相互转换
      • Json数组与Java List相互转换
    • 泛型支持
    • 注解
      • @SerializedName 属性重命名
      • @Expose 序列化策略
    • 过滤
    • serializeNulls 输出null
    • 格式日期时间

Gson总结

依赖库

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

基本API介绍

JsonElement有4个子类:
- JsonObject
- JsonArray
- JsonPrimitive
- JsonNullJsonElement常用方法:
isJsonArray()
getAsJsonArray()
isJsonObject()
getAsJsonObject()
isJsonPrimitive()
getAsJsonPrimitive()
isJsonNull()
getAsJsonNull()

基本用法

生成Json字符串

JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", "小明");
jsonObject.addProperty("age", 18);
jsonObject.addProperty("sex", true);JsonArray jsonArray = new JsonArray();
jsonArray.add("北京市");
jsonArray.add("广州市");
jsonArray.add("上海市");
jsonObject.add("address", jsonArray);System.out.println(jsonObject.toString());
{"name":"小明","age":18,"sex":true,"address":["北京市","广州市","上海市"]}

toJson & fromJson

  • 序列化:将Java对象转为Json字符串。
  • 反序列化:将Json字符串转为Java对象。
public class User {private String name;private int age;private boolean sex;private String[] address;public User() {}public User(String name, int age, boolean sex, String[] address) {this.name = name;this.age = age;this.sex = sex;this.address = address;}//省略setter/getter toString()
}

序列化 toJson

Gson gson = new Gson();
User user = new User("小白", 18, true, new String[]{"北京市", "上海市", "广州市"});
String json = gson.toJson(user);
System.out.println(json);
{"name":"小白","age":18,"sex":true,"address":["北京市","上海市","广州市"]}

反序列化操作 fromJson

Gson gson = new Gson();
String json = "{\"name\":\"小白\",\"age\":18,\"sex\":true,\"address\":[\"北京市\",\"上海市\",\"广州市\"]}\n";
User user = gson.fromJson(json, User.class);
System.out.println(user);
User{name='小白', age=18, sex=true, address=[北京市, 上海市, 广州市]}

Json数组与Java数组相互转换

String json = "[\n" +"{\"name\":\"小白\",\"age\":18,\"sex\":true,\"address\":[\"北京市\",\"上海市\",\"广州市\"]},\n" +"{\"name\":\"小白2\",\"age\":19,\"sex\":false,\"address\":[\"上海市\",\"广州市\"]},\n" +"{\"name\":\"小白3\",\"age\":120,\"sex\":true,\"address\":[\"北京市\",\"广州市\"]}\n" +"]";Gson gson = new Gson();//Json数组转Java数组
System.out.println("Json字符串转Java数组:");
User[] users = gson.fromJson(json, User[].class);
for (User item : users) {System.out.println(item);
}//Java数组转Json数组
System.out.println("Java数组转Json数组:");
String str = gson.toJson(users);
System.out.println(str);
Json字符串转Java数组:
User{name='小白', age=18, sex=true, address=[北京市, 上海市, 广州市]}
User{name='小白2', age=19, sex=false, address=[上海市, 广州市]}
User{name='小白3', age=120, sex=true, address=[北京市, 广州市]}
Java数组转Json数组:
[{"name":"小白","age":18,"sex":true,"address":["北京市","上海市","广州市"]},{"name":"小白2","age":19,"sex":false,"address":["上海市","广州市"]},{"name":"小白3","age":120,"sex":true,"address":["北京市","广州市"]}]

Json数组与Java List相互转换

String json = "[\n" +"{\"name\":\"小白\",\"age\":18,\"sex\":true,\"address\":[\"北京市\",\"上海市\",\"广州市\"]},\n" +"{\"name\":\"小白2\",\"age\":19,\"sex\":false,\"address\":[\"上海市\",\"广州市\"]},\n" +"{\"name\":\"小白3\",\"age\":120,\"sex\":true,\"address\":[\"北京市\",\"广州市\"]}\n" +"]";Gson gson = new Gson();//Json数组转Java List
System.out.println("Json数组转Java List:");
ArrayList<User> userList = gson.fromJson(json, new TypeToken<List<User>>() {}.getType());
System.out.println(userList);//Java List转Json数组
System.out.println("Java List转Json数组:");
String str = gson.toJson(userList);
System.out.println(str);
Json数组转Java List:
[User{name='小白', age=18, sex=true, address=[北京市, 上海市, 广州市]}, User{name='小白2', age=19, sex=false, address=[上海市, 广州市]}, User{name='小白3', age=120, sex=true, address=[北京市, 广州市]}]
Java List转Json数组:
[{"name":"小白","age":18,"sex":true,"address":["北京市","上海市","广州市"]},{"name":"小白2","age":19,"sex":false,"address":["上海市","广州市"]},{"name":"小白3","age":120,"sex":true,"address":["北京市","广州市"]}]

泛型支持

public class Base<T> {private int code;private String message;private T data;
}
String json = "{\n" +
"    \"code\":1,\n" +
"    \"message\":\"success\",\n" +
"    \"data\":{\n" +
"        \"name\":\"小花\",\n" +
"        \"age\":\"38\",\n" +
"        \"sex\":true\n" +
"    }\n" +
"}";
Gson gson = new Gson();
Base<User> userBase = gson.fromJson(json, new TypeToken<Base<User>>() {}.getType());
System.out.println(userBase);
Base{code=1, message='success', data=User{name='小花', age=38, sex=true}}

注解

@SerializedName 属性重命名

public class User {@SerializedName("Name")private String name;@SerializedName("Age")private int age;@SerializedName("Sex")private boolean sex;@SerializedName("Address")private String[] address;
}
Gson gson = new Gson();
String json = "{\"Name\":\"小白\",\"Age\":18,\"Sex\":true,\"Address\":[\"北京市\",\"上海市\",\"广州市\"]}\n";
User user = gson.fromJson(json, User.class);
System.out.println(user);
User{name='小白', age=18, sex=true, address=[北京市, 上海市, 广州市]}

@Expose 序列化策略

@Expose(serialize = true, deserialize = true)   //序列化和反序列化都生效
@Expose(serialize = false, deserialize = true)  //序列化时不生效,反序列化时生效
@Expose(serialize = true, deserialize = false)  //序列化时生效,反序列化时不生效
@Expose(serialize = false, deserialize = false) //序列化和反序列化都不生效,和不写注解一样

过滤

Gson提供excludeFieldsWithModifiers()方法过滤指定数据

public class User {public String name;int age;protected boolean sex;private String[] address;
}
User user = new User("小白", 18, true, new String[]{"北京市", "上海市", "广州市"});
Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PUBLIC, Modifier.PROTECTED).create();
String json = gson.toJson(user);
System.out.println(json);
{"age":18,"address":["北京市","上海市","广州市"]}

serializeNulls 输出null

Gson在进行序列化操作时,如果某个属性值为null,则序列化时不操作该字段,否则使用serializeNulls()进行配置。

User user = new User(null, 18, true, null);
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);
{"age":18,"sex":true}

使用serializeNulls()

User user = new User(null, 18, true, null);
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(user);
System.out.println(json);
{"name":null,"age":18,"sex":true,"address":null}

格式日期时间

public class User {private String name;private int age;private Date date;
}

序列化

Gson gson = new GsonBuilder().setPrettyPrinting() //格式化输出json.setDateFormat("yyyy-MM-dd HH:mm:ss") //格式化日期.create();User user = new User("小黑", 18, new Date());
String json = gson.toJson(user);
System.out.println(json);
{"name": "小黑","age": 18,"date": "2021-02-25 17:38:10"
}

反序列化

String json = "{\n" +"  \"name\": \"小黑\",\n" +"  \"age\": 18,\n" +"  \"date\": \"2021-02-25 17:38:10\"\n" +"}";
User user = gson.fromJson(json, User.class);
System.out.println(user);
User{name='小黑', age=18, date=Thu Feb 25 17:38:10 CST 2021}

Android Gson总结相关推荐

  1. Android Gson在Kotlin data class中的使用

    文章目录 Android Gson在Kotlin data class中的使用 基本使用 NEP 空指针异常问题 空指针异常产生的原因 空安全失效问题 字段全有默认值 字段部分有默认值 解决问题 使用 ...

  2. Android Gson使用详解

    Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 FastJson 两种,这里要介绍的是 Gson ...

  3. Android Gson的使用总结

    1.概念 Gson是谷歌发布的一个json解析框架 2.如何获取 github:https://github.com/google/gson android studio使用 compile 'com ...

  4. android gson工具包,Android Study 之 彻底解决 Gson解析 异常

    > LZ-Say:大风呼呼的刮,就好像妖精要来的前奏一样~ > > 前言 开发过程中,App常用的接收参数的时候,几乎大部分都是以json格式为主,那么有关解析json的方式有很多, ...

  5. Android Gson 操作

    JSON序列化后的数据不带类名与名命空间,所以这两个服务端跟客户端可以不对应,需要保证字段对应即可 Asp.net MVC端 using System; using System.Collection ...

  6. Android—Gson原理解析

    JsonElement 抽象类 代表json串的某一个元素 某一个元素: JsonObject JsonArray JsonPrimitive(基本类型) JsonNull JsonElement的四 ...

  7. Android Gson解析json详解

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  8. Android Gson深入分析

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  9. Android Gson类型转换错误解决 com.google.gson.internal.LinkedTreeMap

    com.google.gson.internal.LinkedTreeMap不能转换到我的类(com.google.gson.internal.LinkedTreeMap cannot be cast ...

最新文章

  1. LabVIEW仪表盘识别(实战篇—6)
  2. PTA数据结构与算法题目集(中文)7-15
  3. 【SPOJ】Count On A Tree II(树上莫队)
  4. xx is not in the sudoers file 问题解决
  5. 在Ubuntu11.10下构建hadoop实验环境笔记
  6. MySQL5.7.17绿色版安装
  7. 什么叫开关电源?捏碎了喂给你吃!
  8. 板邓:wordpress中add_action()和do_action()关系
  9. java二次方程式答案_二次方程式Java?
  10. javascript特效:会随着鼠标而动的眼睛
  11. Pandas读取excel中的数据,并利用现有列数据生成新列
  12. 醉林疯的PTA 7-2 换硬币 (20分)
  13. android 系统级闹铃,Android 设置系统闹铃和日历
  14. 巴西电商Olist数据分析项目:SQL+FineBI
  15. 36-基于51单片机士壤湿度检测及自动浇花系统
  16. 硬核干货!全球数字高程数据(DEM)详解,还有地形晕渲、等高线等
  17. 各种效应:蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论、马太效应
  18. 使用python删除一个文件或文件夹
  19. 4.15早盘黄金行情平平,白银TD纸白银行情分析
  20. mysql5.7.19收费》_mysql5.7.19安装

热门文章

  1. SQL语句ROUND函数(四舍五入,保留小数位)
  2. word 字体 中英文对照
  3. 双机热备与负载均衡(双设备)的区别
  4. 中专学计算机平面设计大专可以转专业吗,我想转专业,请问怎么办呢?
  5. chrome顶部变黑_win10系统chrome内核浏览器地址栏变黑的解决方法
  6. java程序员必备软件,最终入职阿里
  7. Asp.net mvc validaterequest无效的问题
  8. [iOS]渐变毛玻璃效果
  9. opssl php rsa_PHP RSA加解密示例(转)
  10. 数据库操作重点总结记录 ExecuteReader OleDbDataReader...