首页 > 其他分享 >google gson学习

google gson学习

时间:2023-06-04 14:33:00浏览次数:37  
标签:google name age 学习 new com gson


[color=red][b]google gson学习[/b][/color]
[url]http://lyking2001.iteye.com/blog/504156[/url]
Gson网址http://code.google.com/p/google-gson/

[b]1.简单的处理list和map[/b]

Gson gson = new Gson();  
List testList = new ArrayList();  
testList.add("first");  
testList.add("second");  
String listToJson = gson.toJson(testList);  
System.out.println(listToJson);       
//prints ["first","second"]



Map testMap = new HashMap();  
testMap.put("id", "id.first");  
testMap.put("name","name.second");  
String mapToJson = gson.toJson(testMap);  
System.out.println(mapToJson);    
//prints {"id":"id.first","name":"name.second"}


[b] 2.处理带泛型的集合[/b]


List<TestBean> testBeanList = new ArrayList<TestBean>();  
TestBean testBean = new TestBean();  
testBean.setId("id");  
testBean.setName("name");  
testBeanList.add(testBean);  
Java代码  
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<TestBean>>() {  
}.getType();  
String beanListToJson = gson.toJson(testBeanList,type);  
System.out.println(beanListToJson);  
//prints [{"id":"id","name":"name"}]



List<TestBean> testBeanListFromJson = gson.fromJson(beanListToJson, type);


System.out.println(testBeanListFromJson);


//prints [TestBean@1ea5671[id=id,name=name,birthday=<null>]]


map等其他集合类型同上




[b]3.Date类型转化[/b]



先写工具类


import java.lang.reflect.Type;  

import com.google.gson.JsonDeserializationContext;  
import com.google.gson.JsonDeserializer;  
import com.google.gson.JsonElement;  
import com.google.gson.JsonParseException;  

public class UtilDateDeserializer implements JsonDeserializer<java.util.Date> {  

    @Override  
    public java.util.Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)  
            throws JsonParseException {  
        return new java.util.Date(json.getAsJsonPrimitive().getAsLong());  
    }  
}


import java.lang.reflect.Type;  

import com.google.gson.JsonElement;  
import com.google.gson.JsonPrimitive;  
import com.google.gson.JsonSerializationContext;  
import com.google.gson.JsonSerializer;  

public class UtilDateSerializer implements JsonSerializer<java.util.Date> {  

    @Override  
    public JsonElement serialize(java.util.Date src, Type typeOfSrc,     
            JsonSerializationContext context) {     
        return new JsonPrimitive(src.getTime());     
    }     

}  

Java代码  
/** 
     * 序列化方法 
     * @param bean 
     * @param type 
     * @return 
     */  
    public static String bean2json(Object bean, Type type) {  
        Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class, new UtilDateSerializer())  
                .setDateFormat(DateFormat.LONG).create();  
        return gson.toJson(bean);  
    }  

    /** 
     * 反序列化方法 
     * @param json 
     * @param type 
     * @return 
     */  
    public static <T> T json2bean(String json, Type type) {  
        Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class, new UtilDateDeserializer())  
                .setDateFormat(DateFormat.LONG).create();  
        return gson.fromJson(json, type);  
    }




现在开始测试


List<TestBean> testBeanList = new ArrayList<TestBean>();  
TestBean testBean = new TestBean();  
testBean.setId("id");  
testBean.setName("name");  
testBean.setBirthday(new java.util.Date());  
testBeanList.add(testBean);  

java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<TestBean>>() {  
}.getType();  
String beanListToJson = bean2json(testBeanList, type);  
System.out.println("beanListToJson:" + beanListToJson);  
//prints [{"id":"id","name":"name","birthday":1256531559390}]  

List<TestBean> testBeanListFromJson = json2bean(beanListToJson, type);  
System.out.println(testBeanListFromJson);  
//prints [TestBean@77a7f9[id=id,name=name,birthday=Mon Oct 26 12:39:05 CST 2009]]


后记:对于java.sql.Date的转化同上类似,写两个类用于其序列化和反序列化即可SQLDateDeserializer implements JsonDeserializer<java.sql.Date>


SQLDateSerializer implements JsonSerializer<java.sql.Date>




对于GsonBuilder详见:


[url] http://google-gson.googlecode.com/svn/tags/1.2.3/docs/javadocs/com/google/gson/GsonBuilder.html[/url]



[color=red][b]Gson简要使用笔记[/b][/color]




gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。



下面是一个简单的例子:



Person实体



[url]public class Person {


 private String name;

 private int age;


 /**

 * @return the name

 */

 public String getName() {

 return name;

 }


 /**

 * @param name the name to set

 */

 public void setName(String name) {

 this.name = name;

 }


 /**

 * @return the age

 */

 public int getAge() {

 return age;

 }


 /**

 * @param age the age to set

 */

 public void setAge(int age) {

 this.age = age;

 }


 @Override

 public String toString()

 {

 return name + ":" +age;

 }

}[/url]


实体很简单,两个字段,当然实体中的字段也可以是List或者Set类型的。



[b]生成Json字符串[/b]


[url]Gson gson = new Gson();

List<Person> persons = new ArrayList<Person>();

for (int i = 0; i < 10; i++) {

 Person p = new Person();

 p.setName("name" + i);

 p.setAge(i * 5);

 persons.add(p);

}

String str = gson.toJson(persons);[/url]



上面的代码重点是Gson对象,它提供了toJason()方法将对象转换成Json字符串,上面代码的str对象值为:


[{"name":"name0","age":0},{"name":"name1","age":5},{"name":"name2","age":10},{"name":"name3","age":15},{"name":"name4","age":20},{"name":"name5","age":25},{"name":"name6","age":30},{"name":"name7","age":35},{"name":"name8","age":40},{"name":"name9","age":45}]


很标准的json数据,很简单吧,呵呵。



下面来看看[b]gson的反序列化[/b],Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。



在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。



先来看[b]第一种[/b]:



比如json字符串为:[{"name":"name0","age":0}]



代码:



Person person = gson.fromJson(str, Person.class);


提供两个参数,分别是json字符串以及需要转换对象的类型。



[b]第二种,转换成列表类型:[/b]



代码:



List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for(int i = 0; i < ps.size() ; i++)
{
     Person p = ps.get(i);
     System.out.println(p.toString());
}


可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。



Gson的基本使用就是这么多,至于annotation方面可以参考gson的官方文档,希望能对初学java和gson的同学有所帮助。


标签:google,name,age,学习,new,com,gson
From: https://blog.51cto.com/u_3871599/6410614

相关文章

  • dubbo源码学习(四)初始化过程细节:解析服务
    今天将真正去看dubbo内部的实现过程,看dubbo的源码前我先把dubbo的用户指南和开发指指南大概的看了一遍,这样再看dubbo源码比较轻松。从用户指南和开发指指南可以找到相应的切入点,今天将介绍的是dubbo的初始化解析bean的过程:解析服务基于dubbo.jar内的META......
  • dubbo源码学习(二) : spring 自定义标签
    做dubbo的配置时很容易发现,dubbo有一套自己的标签,提供给开发者配置,其实每一个标签对应着一个实体,在容器启动的时候,dubbo会对所有的配置进行解析然后将解析后的内容设置到实体里,最终dubbo会根据实体中的值生成贯穿全局的统一URL。利用自定义标签使配置简单明......
  • 极客时间--golang并发编程实战课--Mutex学习总结
    互斥锁的实现机制互斥锁是并发控制的一个手段,是为了避免竞争而建立的一种并发控制机制。在并发编程中,如果程序中的一部分会被并发访问或修改,那么,为了避免并发访问导致的意想不到的结果,这部分程序需要被保护起来,这部分被保护起来的程序,就叫做临界区。可以说,临界区就是一个被共......
  • 深入学习ThreadLocal
    1、用来干吗的?用于线程在任意的地方去共享数据,而不被其他线程所干扰,2、原理是什么因为每个线程维护一份ThreadLocalMap,使用threadlocal.set(obj)方法是存放在map里面的Entry<<WeekReference>ThreadLocal,Value>数组里3、实际案例,比如写了util类,但是SimplateDateFormate是线程......
  • python基础学习-读写CSV文件
    CSV文件介绍参考:Python-Core-50-Courses/第23课:用Python读写CSV文件.mdatmaster·jackfrued/Python-Core-50-Courses(github.com)CSV 全称逗号分隔值文件是一种简单、通用的文件格式,被广泛的应用于应用程序(数据库、电子表格等)数据的导入和导出以及异构系统之间的数据......
  • python基础学习-发送邮件
    importsmtplibfromemail.headerimportHeaderfromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMEText"""发送普通邮件"""#创建邮件主体对象email=MIMEMultipart()#设置发件人、收件人和主题email['From']=&#......
  • python基础学习-XPath解析html
    参考地址:Python-Core-50-Courses/第33课:用Python解析HTML页面.mdatmaster·jackfrued/Python-Core-50-Courses(github.com) XPath是在XML(eXtensibleMarkupLanguage)文档中查找信息的一种语法,XML跟HTML类似也是一种用标签承载数据的标签语言,不同之处在于XML的标签......
  • python基础学习-字典
    """字典dict定义:元素是键值对,key不能重复,不能使用下标索引,key是除字典外其他类型,value为任意类型,可嵌套,可修改,支持for循环,不支持while循环#字面量{key:value,key:value,key:value}#定义变量变量名称={key:value,key:value,key:value}#定义空列表变量名称=dict()......
  • python基础学习-异常
    """异常:捕获异常:基本语法:try:可能发生错误的代码except:出现异常执行代码else:没异常,执行finally:无论有无异常,都执行异常具有传递性"""#捕获指定异常try:print(name)exceptNameErrorase:print("出现未定义异常")print(e)#捕获多个异常try:p......
  • gitignore规则再学习
    gitignore规则之前就学习过,不过到现在还是一知半解,昨天又重新学习了一下,并做了一些实验,似乎又明白了,所以记录下来,以备后续查阅.首先,.gitignore文件所在的目录作为匹配的根目录对于每一个目录或者文件全路径,进行匹配规则验证如下所示的目录结构:要匹配的文件......