Gson泛型解析Json字符串总结

编程入门 行业动态 更新时间:2024-10-08 04:27:48

Gson泛型解析Json<a href=https://www.elefans.com/category/jswz/34/1771434.html style=字符串总结"/>

Gson泛型解析Json字符串总结

最近在公司实习,要写一个解析Json的工具类。本蒟蒻在翻阅了众多博客中,终于得到了一点收获,故写下这篇博客记录一下。

本博客只是提供解决办法的思路,泛型封装可能没有那么完美,敬请原谅。

参考博客:

Gson 使用总结 高级用法

搞定Gson泛型封装

Gson解析list

使用GSON和泛型解析约定格式的JSON字符串

公司解析Json字符串格式常见以下两种:

// data 为 object 的情况
{"code":"0","message":"success","data":{}}
// data 为 array 的情况
{"code":"0","message":"success","data":[]}

首先泛型封装Result类

/**lombok工具偷懒神器导入依赖<!-- .projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency>
*/import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data //提供getter,setter方法
@AllArgsConstructor //提供有参构造方法 (可以没有)
@NoArgsConstructor	//提供无参构造方法 (一定要有!)
public class Result<T>{private int code;private String msg;private T data;
}

测试类(Grade.class / CarInfo.class)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Grade {private String course;private int score;
//    private String level;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class CarInfo {private int id;private int carId;private String carNum;private int listType;private int ownerId;private String owner;private int parkType;private String parkTypeStr;private String parkinglotCode;
}

Gson泛型封装工具类

import com.example.springbootdemo.domain.Result;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;@SuppressWarnings("all")
public class GsonUtils {/*** Gson对象的各种配置* @return*/public static Gson getGson(){Gson gson = new GsonBuilder()//序列化null.serializeNulls()// 设置日期时间格式,另有2个重载方法// 在序列化和反序化时均生效.setDateFormat("yyyy-MM-dd hh:mm:ss")// 禁此序列化内部类.disableInnerClassSerialization()//生成不可执行的Json(多了 )]}' 这4个字符)//.generateNonExecutableJson()//禁止转义html标签.disableHtmlEscaping()//格式化输出.setPrettyPrinting().create();return gson;}/*** 数组对象解析* @param jsonData* @param clazz* @param <T>* @return*/public static <T> List<T> parseJsonToList(String jsonData, Class<T> clazz) {//Json的解析类对象JsonParser parser = new JsonParser();//将JSON的String 转成一个JsonArray对象JsonArray jsonArray = parser.parse(jsonData).getAsJsonArray();Gson gson = getGson();ArrayList<T> resultList = new ArrayList<>();for (JsonElement jsonElement : jsonArray) {T t = gson.fromJson(jsonElement, clazz);resultList.add(t);}return resultList;}/*** 处理 data 为 object 的情况* @param jsonData* @param clazz* @param <T>* @return*/public static <T> Result<T> fromJsonObject(String jsonData, Class<T> clazz) {Gson gson = getGson();Type type = new TypeToken<Result<T>>(){}.getType();return gson.fromJson(jsonData,type);}/*** 处理 data 为 array 的情况* @param jsonData* @param clazz* @param <T>* @return*/public static <T> Result<List<T>> fromJsonArray(String jsonData, Class<T> clazz){Gson gson = getGson();Type type = new TypeToken<Result<List<T>>>(){}.getType();return gson.fromJson(jsonData, type);}
}

Gson测试类

/**需要导入Junit依赖<!--  --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
*/
import com.example.springbootdemo.domain.*;
import com.google.gson.Gson;
import org.junit.Test;import java.util.List;@SuppressWarnings("all")//压制警告(有波浪线看起来实在太难受了)
public class GsonTest {@Testpublic void test_fromJsonObject(){//创建需要需要解析的实体类Result<Grade> gradeRes = new Result<>(500, "操作失败", new Grade("Math", 100));Gson gson = GsonUtils.getGson();//转化成json字符串String json = gson.toJson(gradeRes);//data是Object的情况Result<Grade> result = GsonUtils.fromJsonObject(json, Grade.class);//解析出Result中的属性System.out.println(result.getdataCode());System.out.println(result.getMsg());//由于data属性也是一个对象,再嵌套解析一次,就可以得到需要data实体类信息String toJson = gson.toJson(result.getData());Grade grade = gson.fromJson(toJson, Grade.class);System.out.println(grade.getCourse());}@Testpublic void test_fromJsonArray(){//得到需要解析的Json字符串String jsonData = "{\"code\": 200,\"msg\": \"success\",\"data\": [{\"course\": \"Chinese\",\"score\":95},{\"course\":\"Math\",\"score\":21}]}";//解析外层的Result类Result<List<Grade>> listResult = GsonUtils.fromJsonArray(jsonData, Grade.class);//得到code 和 msg 信息System.out.println(listResult.getCode());System.out.println(listResult.getMsg());//解析内层data列表对象信息Gson gson = GsonUtils.getGson();String toJson = gson.toJson(listResult.getData());List<Grade> grades = GsonUtils.parseJsonToList(toJson, Grade.class);for (Grade grade : grades) {System.out.println(grade.getCourse());}}@Testpublic void test_more(){//思路同上,多加练习一遍String jsonData = "{\"code\":200,\"msg\":\"操作成功\",\"data\":[{\"id\":728,\"carId\":728,\"carNum\":\"浙G32T36\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":727,\"carId\":727,\"carNum\":\"浙G33586\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":726,\"carId\":726,\"carNum\":\"浙G08KV6\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":725,\"carId\":725,\"carNum\":\"浙GD86632\",\"listType\":0,\"ownerId\":520,\"owner\":\"方振宇\",\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":724,\"carId\":724,\"carNum\":\"浙G5H865\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":723,\"carId\":723,\"carNum\":\"浙G06L28\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":720,\"carId\":720,\"carNum\":\"浙G8H292\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":719,\"carId\":719,\"carNum\":\"浙G10H5V\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":718,\"carId\":718,\"carNum\":\"浙G75M27\",\"listType\":0,\"ownerId\":1178,\"owner\":\"胡迪潇\",\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":717,\"carId\":717,\"carNum\":\"浙GD13226\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":714,\"carId\":714,\"carNum\":\"浙G543KZ\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":713,\"carId\":713,\"carNum\":\"浙AP1J17\",\"listType\":0,\"ownerId\":1178,\"owner\":\"胡迪潇\",\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":712,\"carId\":712,\"carNum\":\"浙G2HP00\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"},{\"id\":705,\"carId\":705,\"carNum\":\"浙G9X6Z2\",\"listType\":0,\"ownerId\":null,\"owner\":null,\"parkType\":1,\"parkTypeStr\":\"普通车\",\"parkinglotCode\":\"\"}]}";Result<List<CarInfo>> listResult = GsonUtils.fromJsonArray(jsonData, CarInfo.class);System.out.println(listResult.getCode());System.out.println(listResult.getMsg());Gson gson = GsonUtils.getGson();String toJson = gson.toJson(listResult.getData());List<CarInfo> carInfos = GsonUtils.parseJsonToList(toJson, CarInfo.class);for (CarInfo carInfo : carInfos) {System.out.println(carInfo.getCarNum());}}
}

总结:解析步骤

  • 得到需要解析的Json字符串
  • 分情况对于data是一个对象 和 是一个对象列表调用对应的方法解析出外层Result的code和msg信息
  • 再对内层data对象,仿照上一步再解析一次
  • 输出测试是否能到对象的内部属性信息即可

更多推荐

Gson泛型解析Json字符串总结

本文发布于:2024-02-06 15:53:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749945.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   Gson   Json

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!