- 浏览: 70760 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (76)
- Acitviti (5)
- mybatis (4)
- 大数据 (5)
- servlet (1)
- 负载均衡 (1)
- lucene5.X (3)
- mysql (3)
- 数据库 (2)
- Linux (3)
- Java (10)
- SSO (2)
- spring (3)
- layer (1)
- JAVA多线程 (12)
- 设计模式 (1)
- hadoop (6)
- hdfs (2)
- zookeeper (3)
- yarn (1)
- hive (4)
- sqoop (1)
- redis (1)
- GSON (1)
- velocity (1)
- git (1)
- logback (1)
- shell (9)
- IntellJ idea (1)
- JVM (2)
- maven (1)
最新评论
一般使用Gson我们一般会用在序列化toJson()和反序列化fromJson(),一般就那么几个方法,使用比较方便简单。
Gson在基本类型中的使用
Gson对POJO类的序列化与反序列化
Gson中使用泛型
总结一下上边可能是我们最长用到的
1.将对象序列化
2.将jsonString反序列化为对象
3.将reader反序列化为对象
4.将jsonString反序列化为List<对象> Type
5.将reader反序列化为List<对象> Type
底层分析
//需要将传递过来的对象直接指定可以序列化
//需要传递过来时候将aaa_bbb直接以aaaBbb解析出来
//或者是需要将驼峰格式转化为下划线的格式
//转化过程中是否需要全部转化为小写
//转化中是否需要序列化null
//序列化中时间格式是否需要修改
//是否有序列化内部类
//是否需要生成特别的json,就是说不是直接拿到就是json比如加几个]}等特殊字符
//是否要转意html标签
//是否可以指定的字段不输出
等等。。。
@Expose //使用默认都是false
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效
大于等于Since的值时该字段导出,小于Until的值时该该字段导出
一个字段用两个注解时候记得要满足两者
@Since 和 @Until
使用setFieldNamingPolicy时候要注意不要使用@SerializedName,不知道为什么在使用自定义的级别没有@SerializedName的级别高。
所以在遇到@SerializedName想要转换时候要注意,这有可能是你找问题的源头。又会骂gson的烂什么的。
Gson序列化和反序列化的都是借助于GsonBuilder.registerTypeAdapter和GsonBuilder.registerTypeHierarchyAdapter得以施展
//自己构建自己需要的Gson
Gson源码查看
接管某种类型的序列化JsonSerializer和反序列化JsonDeserializer
Gson在基本类型中的使用
Gson gson=new Gson(); int i=gson.fromJson("100",int.class); double d = gson.fromJson("\"99.99\"", double.class); //99.99 boolean b = gson.fromJson("true", boolean.class); // true String str = gson.fromJson("String", String.class); // String System.out.println(i+" " +d+" " +b+ " " +str); //基本数据类型序列化 String jsonNumber = gson.toJson(100); // 100 String jsonBoolean = gson.toJson(false); // false String jsonString = gson.toJson("String"); //"String"
Gson对POJO类的序列化与反序列化
public class User{ private String name; private int age; private String emailAddress; @SerializedName(value = "userInfo",alternate = {"user_info","info"}) private String userInfo; public User(String name, int age, String emailAddress) { this.name = name; this.age = age; this.emailAddress = emailAddress; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } public String getUserInfo() { return userInfo; } public void setUserInfo(String userInfo) { this.userInfo = userInfo; } }
//先序列化 User user=new User("lijian",22,"山西省"); System.out.println(gson.toJson(user)); //{"name":"lijian","age":22,"emailAddress":"山西省"}
//为POJO字段提供备选属性名alternate提供多个值,如果是多个值中有一个就存那一个,如果都有值就按照alternate 中的最后一个定义获得值, String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24,emailAddress:23453245,user_info:2323,info:lksjdl}"; User user1=gson.fromJson(jsonString,User.class); System.out.println(user1.getUserInfo());
Gson中使用泛型
//数组比较简单 String jsonArray = "[aaaa,bbbb,cccc]"; String[] strings = gson.fromJson(jsonArray, String[].class); //List中泛型只有对应的List.class所以使用list时候注意List的泛型檫除 //这里Gson为我们引入了TypeToken来对泛型的支持 Gson gson = new Gson(); String jsonArray = "[aaa,bbbb,ccc]"; String[] strings = gson.fromJson(jsonArray, String[].class); List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>(){}.getType()); System.out.println(stringList); //[aaa, bbbb, ccc] 注意:这里使用时候看看是否自己可以封装一个统一的工具,如果每次使用时候都会new一个TypeToken,试试工具中自己可以封装一些东西让工具调用更加简单
总结一下上边可能是我们最长用到的
1.将对象序列化
2.将jsonString反序列化为对象
3.将reader反序列化为对象
4.将jsonString反序列化为List<对象> Type
5.将reader反序列化为List<对象> Type
底层分析
//这里就是传递的jsonString,可以看见会构建生成StringReader在执行fromJson(Reader json, Class<T> classOfT),可以看得出其实我们上边的5个可以归结为3个,以后在实际中调用最多的可以单独出来处理封装。 public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException { if(json == null) { return null; } else { StringReader reader = new StringReader(json); Object target = this.fromJson((Reader)reader, (Type)typeOfT); return target; } } public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException { JsonReader jsonReader = this.newJsonReader(json); Object object = this.fromJson((JsonReader)jsonReader, (Type)classOfT); assertFullConsumption(object, jsonReader); return Primitives.wrap(classOfT).cast(object); }
//需要将传递过来的对象直接指定可以序列化
//需要传递过来时候将aaa_bbb直接以aaaBbb解析出来
//或者是需要将驼峰格式转化为下划线的格式
//转化过程中是否需要全部转化为小写
//转化中是否需要序列化null
//序列化中时间格式是否需要修改
//是否有序列化内部类
//是否需要生成特别的json,就是说不是直接拿到就是json比如加几个]}等特殊字符
//是否要转意html标签
//是否可以指定的字段不输出
等等。。。
//在初始化构造时候就默认构造进Gson中的值 public Gson() { this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY, Collections.emptyMap(), false, false, false, true, false, false, false, LongSerializationPolicy.DEFAULT, Collections.emptyList()); }
//通过GsonBuilder构建修改默认的值 //自己构建自己需要的Gson Gson gson = new GsonBuilder(). serializeNulls()//序列化null .generateNonExecutableJson()//生成不能执行的json .setDateFormat("yyyy-MM-dd") //设置日期时间格式, //.setDateFormat(DateFormat.DATE_FIELD) .disableInnerClassSerialization()//禁止序列化内部类 .disableHtmlEscaping()//禁止转移html .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) //驼峰转化为下划线 常用 .excludeFieldsWithModifiers(Modifier.PRIVATE) //指定某些修饰符,比如private等不输出为json .excludeFieldsWithModifiers() //指定字段不输出或者用@Expose 常用 .create();
@Expose //使用默认都是false
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效
大于等于Since的值时该字段导出,小于Until的值时该该字段导出
一个字段用两个注解时候记得要满足两者
@Since 和 @Until
使用setFieldNamingPolicy时候要注意不要使用@SerializedName,不知道为什么在使用自定义的级别没有@SerializedName的级别高。
所以在遇到@SerializedName想要转换时候要注意,这有可能是你找问题的源头。又会骂gson的烂什么的。
Gson序列化和反序列化的都是借助于GsonBuilder.registerTypeAdapter和GsonBuilder.registerTypeHierarchyAdapter得以施展
class UserAdapter<T> extends TypeAdapter<T> { public void write(JsonWriter jsonWriter, T t) throws IOException { //序列化操作 } public T read(JsonReader jsonReader) throws IOException { //反序列化操作 return null; } } class User { public String name; public int age; public String address; }
//自己构建自己需要的Gson
Gson gson = new GsonBuilder() //这里需要重新写自己构建的适应 .registerTypeAdapter(User.class,new UserAdapter<User>()) //如果使用了该类将会失去默认的好多东西 .create(); //转化为String JsonSerializer<Number> numberJsonSerializer = new JsonSerializer<Number>() { @Override public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(String.valueOf(src)); } }; Gson gson = new GsonBuilder() .registerTypeAdapter(Integer.class, numberJsonSerializer).create(); //这样类型进去就会转化为String
Gson源码查看
public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) { TypeAdapter cached = (TypeAdapter)this.typeTokenCache.get(type == null?NULL_KEY_SURROGATE:type); if(cached != null) { return cached; } else { Object threadCalls = (Map)this.calls.get(); boolean requiresThreadLocalCleanup = false; if(threadCalls == null) { threadCalls = new HashMap(); this.calls.set(threadCalls); requiresThreadLocalCleanup = true; } Gson.FutureTypeAdapter ongoingCall = (Gson.FutureTypeAdapter)((Map)threadCalls).get(type); if(ongoingCall != null) { return ongoingCall; } else { try { Gson.FutureTypeAdapter call = new Gson.FutureTypeAdapter(); ((Map)threadCalls).put(type, call); Iterator var7 = this.factories.iterator(); TypeAdapter candidate; do { if(!var7.hasNext()) { throw new IllegalArgumentException("GSON cannot handle " + type); } TypeAdapterFactory factory = (TypeAdapterFactory)var7.next(); candidate = factory.create(this, type);//这里工厂构建对应的适配器 } while(candidate == null); call.setDelegate(candidate); this.typeTokenCache.put(type, candidate); TypeAdapter var10 = candidate; return var10; } finally { ((Map)threadCalls).remove(type); if(requiresThreadLocalCleanup) { this.calls.remove(); } } } } }
接管某种类型的序列化JsonSerializer和反序列化JsonDeserializer
@JsonAdapter(UserTypeAdapter.class) //加在类上@JsonAdapter 仅支持 TypeAdapter或TypeAdapterFactory public class User { public User() { } public User(String name, int age) { this.name = name; this.age = age; } public User(String name, int age, String email) { this.name = name; this.age = age; this.email = email; } public String name; public int age; }
发表评论
-
FastJson添加mark隐藏字符
2017-09-05 16:46 1069我们要做的是一个基于日志打印时候需要对敏感信息进行加密。简单的 ... -
Java编译调试之常用命令 之jmap
2017-08-30 10:03 739jmap命令 ps -ef| grep java root ... -
Java编译之常用命令 -javap
2017-08-30 09:50 507javap定义 javap是 Java class文件分解器, ... -
性能调优篇 1.0
2017-08-17 09:10 311刻意追求,性能不佳 同事写了一段牛逼的代码我以为这个是为了提升 ... -
Java中Log日志使用
2017-03-04 18:32 372Commons_logging包 Apache通用日志包 他为 ... -
【状态模式】基于状态更新后多消息通知
2016-04-12 10:14 508定义对象间的一种多对多的的依赖关系,当一个对象的状态发生改变时 ... -
Activiti Modeler引入web项目
2016-03-19 21:10 2494在使用Activiti Modeler时候先从Activiti ... -
递归求解集合
2016-01-26 16:35 511字符串翻转 /** * 将字符串翻转 * ... -
JDK8新特性
2016-01-18 18:22 494特性1 /** * 接口的默 ...
相关推荐
总的来说,Gson是Java世界中处理JSON的首选工具之一,其简洁的API、强大的功能以及Google的支持,使其在众多JSON库中脱颖而出。使用Gson-2.8.0.jar,开发者可以获得稳定和高性能的JSON处理能力,而gson-master.zip中...
在Java编程中,`...Gson库的灵活性和强大功能使其成为Java开发中处理JSON数据的首选工具之一。通过熟练掌握`JsonObject`和`JsonArray`的使用,可以高效地处理JSON数据,实现各种复杂的序列化和反序列化需求。
为了帮助开发者更好地理解和使用Gson,官方提供了一系列的示例代码。这些示例涵盖了基本的用法以及高级特性,如定制序列化策略、处理日期时间、忽略特定字段等。通过学习这些示例,开发者可以快速上手并有效地利用...
Gson是Google开发的一款Java库,用于在Java对象和JSON数据之间进行映射。它的全称为Google Simple Serialization for Java,其主要目标是提供一个简单、高效的方式来将Java对象转换为JSON字符串,反之亦然。Gson库...
3. **GsonBuilder**: 提供了一系列的配置方法,如设置日期格式、注册自定义类型适配器等,用于构建具有特定配置的Gson实例。 4. **ReflectiveTypeAdapterFactory**: 这是Gson内部的一个重要适配器,负责使用反射...
6. 注解支持:Gson提供了一系列注解,如`@SerializedName`用于重命名JSON字段,`@JsonAdapter`用于自定义序列化/反序列化逻辑,`@JsonTypeInfo`和`@JsonSubTypes`用于处理多态。 7. 安全性:Gson库还提供了安全模式...
Gson库是Google开发的一款强大的Java库,它允许开发者轻松地在JSON数据和Java对象之间进行转换。这个库的核心理念是提供简洁、高效的API,使得Java程序员能够在他们的应用中便捷地处理JSON格式的数据,无论是从网络...
Gson是Google提供的一款强大的Java库,主要用于在Java对象与JSON数据之间进行相互转换。它的全称是Google Simple JSON,其核心功能...由于Gson的广泛使用和社区支持,遇到问题时通常能找到丰富的解决方案和示例代码。
Gson是Google开发的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它使得Java对象可以被转换为JSON格式的字符串,同时也可以将JSON格式的数据转换回相应的Java对象。Gson 2.3.1是这个库的一个稳定版本,...
Gson是Google开发的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它的全名是Google Simple JSON,其主要功能是将Java对象...通过深入学习和熟练运用Gson,你可以在处理JSON数据时提高开发效率和代码质量。
Gson是Google开发的一款Java库,它允许将Java对象转换为JSON格式的字符串,反之亦然。这个"gson-2.8.5.zip"压缩包包含的是Gson库的版本2.8.5,其中的核心文件是"gson-2.8.5.jar"。这个版本的Gson提供了许多增强的...
Gson是Google开发的一款Java库,它允许将Java对象转换为JSON格式的字符串,同时也能将JSON数据解析回等效的Java对象。这个压缩包"**gson-2.8.6.zip**"包含了Gson库的主要组件,即版本号为2.8.6的"gson-2.8.6.jar...
在Java开发中,Gson库是一个非常常用的工具,它由Google提供,用于在Java对象和JSON数据之间进行互相转换。Gson库的强大之处在于它的灵活性和便捷性,使得处理JSON格式的数据变得简单易行。本测试类将深入探讨如何...
Gson是Google开发的一款Java库,用于在Java对象和JSON数据之间进行映射。这个库使得Java对象可以被转换为JSON字符串,同时也可以将JSON文本解析回等效的Java对象。Gson因其简单易用、功能强大而在Java开发者中广受...
Gson库,全称为Google Simple JSON,是由Google提供的一个开源Java库,主要目的是方便Java对象与JSON数据之间的互相转换。这个库的设计理念是简洁、高效,使得开发者在处理JSON序列化和反序列化时能够更加便捷。Gson...
Gson是Google开发的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它使得Java对象可以轻松地转换为JSON格式,并且能够将JSON数据解析回等效的Java对象。在本压缩包中,包含了gson-2.8.0版本的三个重要...
Gson 2.7 是一个Java库,由Google开发并开源,主要用于在Java对象和JSON数据之间进行相互转换。这个库极大地简化了JSON格式的数据处理,使得开发者无需手动编写繁琐的序列化和反序列化代码,从而提高了开发效率。...
Gson是Google开发的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。Gson 2.6.1是这个库的一个版本,它提供了一系列优化和改进,以更好地支持JSON数据的解析和序列化。这个工具包可以帮助开发者轻松地将...
这个资源显然提供了一系列关于如何使用Gson进行JSON处理的例子,使得开发者能够轻松理解和应用Gson的功能。 1. **Gson库介绍** Gson是Google提供的一个开源库,它提供了丰富的API来处理JSON数据。它允许我们把Java...
10. 社区支持:作为Google维护的开源项目,Gson有活跃的社区和丰富的文档资源,遇到问题时可以找到相应的解决方案和示例代码。 综上所述,Google Gson 2.2.3是一个强大的JSON处理工具,它提供了丰富的功能来满足...