版权声明:未经许可,不允许转载。 https://blog.csdn.net/fjnpysh/article/details/79700604
其他相关的资料百度,各大博客论坛都有 我就不一一抄袭总结了..
- 简单对象转换
Obj obj = new Gson().fromJson(json,Obj .class);
- List简单对象转换
List<Obj> objList = new Gson().fromJson(json,new TypeToken<List<Obj>>(){}.getType());
- GsonBuilder对象使用
- //注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson();
- Gson gson = new GsonBuilder()
- .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
- .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
- .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
- .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
- .setPrettyPrinting() //对json结果格式化.
- .setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
- //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
- //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
- .create();
- Gson注解(应该还有很多)
- private int id; //不导出
- @Expose //输出json字段 不指定Name
- private String name;
- @Expose
- @SerializedName("bir") //重新指定 导出字段为bir
- private Date birthDay;
- Map的处理(简单对象)
- Map<Point, String> map1 = new LinkedHashMap<Point, String>();// 使用LinkedHashMap将结果按先进先出顺序排列
- map1.put(new Point(5, 6), "a");
- map1.put(new Point(8, 8), "b");
- String s = gson.toJson(map1);
- System.out.println(s);// 结果:[[{"x":5,"y":6},"a"],[{"x":8,"y":8},"b"]]
- Map<Point, String> retMap = gson.fromJson(s,
- new TypeToken<Map<Point, String>>() {
- }.getType());
- for (Point p : retMap.keySet()) {
- System.out.println("key:" + p + " values:" + retMap.get(p));
- }
- System.out.println(retMap);
- Map的复杂对象处理
- Map<String, Object> map = new LinkedHashMap<String, Object>();
- map.put("students", stulist);
- map.put("teachers", teacherList);
- Gson gson = new Gson();
- String s = gson.toJson(map);
- System.out.println(s);
- System.out.println("----------------------------------");
- Map<String, Object> retMap = gson.fromJson(s,
- new TypeToken<Map<String, List<Object>>>() {
- }.getType());
- 实际开发中的特殊需求处理
[{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:54:49 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}]
- public class Student {
- private int id;
- private String name;
- private Date birthDay;
- }
- public class Teacher {
- private int id;
- private String name;
- private String title;
- }
- public class TableData {
- private String tableName;
- private List tableData;
- }
- // 将json转为数据-->start
- List<TableData> tableDatas2 = gson.fromJson(s,
- new TypeToken<List<TableData>>() {
- }.getType());
- for (int i = 0; i < tableDatas2.size(); i++) {
- TableData entityData = tableDatas2.get(i);
- String tableName = entityData.getTableName();
- List tableData = entityData.getTableData();
- String s2 = gson.toJson(tableData);
- // System.out.println(s2);
- // System.out.println(entityData.getData());
- if (tableName.equals("students")) {
- System.out.println("students");
- List<Student> retStuList = gson.fromJson(s2,
- new TypeToken<List<Student>>() {
- }.getType());
- for (int j = 0; j < retStuList.size(); j++) {
- System.out.println(retStuList.get(j));
- }
- } else if (tableName.equals("teachers")) {
- System.out.println("teachers");
- List<Teacher> retTchrList = gson.fromJson(s2,
- new TypeToken<List<Teacher>>() {
- }.getType());
- for (int j = 0; j < retTchrList.size(); j++) {
- System.out.println(retTchrList.get(j));
- }
- }
- }
- // Json转为对象-->end
- 注册TypeAdapter以及处理Enum类型
- public enum PackageState {
- PLAY, UPDATE, UPDATING, DOWNLOAD, DOWNLOADING,
- }
- public class PackageItem {
- private String name;
- private PackageState state;
- private String size;
自己写一个转换器实现JsonSerializer<T>接口和jsonDeserializer<T>接口:
- public class EnumSerializer implements JsonSerializer<PackageState>,
- JsonDeserializer<PackageState> {
- // 对象转为Json时调用,实现JsonSerializer<PackageState>接口
- @Override
- public JsonElement serialize(PackageState state, Type arg1,
- JsonSerializationContext arg2) {
- return new JsonPrimitive(state.ordinal());
- }
- // json转为对象时调用,实现JsonDeserializer<PackageState>接口
- @Override
- public PackageState deserialize(JsonElement json, Type typeOfT,
- JsonDeserializationContext context) throws JsonParseException {
- if (json.getAsInt() < PackageState.values().length)
- return PackageState.values()[json.getAsInt()];
- return null;
- }
- }
- public static void main(String[] args) {
- GsonBuilder gsonBuilder = new GsonBuilder();
- gsonBuilder.registerTypeAdapter(PackageState.class,
- new EnumSerializer());
- Gson gson = gsonBuilder.create();
- PackageItem item = new PackageItem();
- item.setName("item_name");
- item.setSize("500M");
- item.setState(PackageState.UPDATING);// 这个 state是枚举值
- String s = gson.toJson(item);
- System.out.println(s);
- System.out.println("--------------------------------");
- PackageItem retItem = gson.fromJson(s, PackageItem.class);
- System.out.println(retItem);
- }