介绍
介绍
在 app 程序里实现和服务器的交互基本都是提供 json 作为数据传输格式
今天我们就来学习一下通过 Gson 对象来操作 JSON 数据的技巧
准备
导入
添加依赖
打开 Gradle scripts -> build.gradle (Module: app)
在 dependencies 里添加如下依赖项目
implementation 'com.google.code.gson:gson:2.8.2'
点击右上角的 Sync Now 下载库
使用
解析
解析结构需要明白几个问题
不同的数据结构需要建立不同的结构对象去解析
数组结构需要使用 List 去解析
未知 Key/Value 结构需要使用 Map 去解析
解析不一定成功,必须放到 try catch 里运行
标准解析语法
定义结构对象 JsonObject,使用 Gson 的 fromJson 方法去解析
String json = "..."; // json 字符串 Gson gson = new Gson(); JsonObject res = gson.fromJson(json, JsonObject.class);
解析对象 TFJson
为了方便使用,我们将 Gson 封装了一下
后面的示例都是以 TFJson 对象为例的
public class TFJson { /** * 将json 转成对象 * @param jsonResult * @param cla * @param <T> * @return */ public static <T> T jsonDecode(String jsonResult, Class<T> cla) { T t = null; try { Gson gson = new Gson(); t = gson.fromJson(jsonResult, cla); } catch (Exception e) { e.printStackTrace(); } return t; } /** * 将Json字符串转成list * @param json * @param <T> * @return */ public static <T> ArrayList<T> jsonDecodeToArray(String json) { ArrayList<T> t = null; try { Gson gson = new Gson(); t = new ArrayList<T>(); Type type = new TypeToken<ArrayList<T>>() { }.getType(); t = gson.fromJson(json, type); } catch (Exception e) { e.printStackTrace(); } return t; } /** * 将对象转成Json字符串 * @param obj * @return */ public static String jsonEncode (Object obj) { Gson gson = new Gson(); return gson.toJson(obj); } }
解析单一对象
json 结构
{ status: "ok", message: "success" }
通过结构对象解析
java 结构对象
class JsonObject { public String status; public String message; }
java 解析
JsonObject res = TFJson.jsonDecode(json, JsonObject.class);
通过 Map<String, String> 解析
java 解析
Map<String, String> res = new HashMap<>(); res = TFJson.jsonDecode(json, res.getClass());
解析对象数组
json 结构
[ {"id":"12345", "name":"张3"}, {"id":"22345", "name":"李4"} ]
通过结构对象解析
java 结构对象
class JsonObject { public String id; public String name; }
java 解析
List<JsonObject> res = TFJson.jsonDecodeToArray(json);
通过 List<Map<String, String> 解析
java 解析
List<Map<String, String>> res = new ArrayList<>(); res = TFJson.jsonDecode(json, res.getClass());
解析复合结构
json 结构
{ "status": "ok", "message": "success", "data": { "id": 12345, "name": "super man" } }
java 结构
class JsonObject { public String status; public String message; public SubJsonObject data; } class SubJsonObject { int id; String name; }
java 解析
JsonObject res = TFJson.jsonDecode(json, JsonObject.class);
总结
一般情况下我们需要判断 JSON 的数据结构是单一对象还是对象数组,然后使用 jsonDecode 或者 jsonDecodeToArray 去解析
通过 Map 方式解析不需要建立结构对象,但是解析的类型全部是 String 类型,不便于后面的操作
针对复合结构可以建立复合结构对象去解析