本文主要介绍Gson在Java中的详细使用,通过示例代码详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
JSON是一种基于文本的数据交换格式,比XML更轻量级,比二进制更容易读写,模式上更方便。解析和生成的方式有很多种,Java中最常用的类库有JSON-Java、Gson、Jackson、FastJson等。
一、Gson的基本用法
Gson提供了两个方法,fromJson()和toJson(),直接用于解析和生成。前者实现反序列化,后者实现序列化。同时,每个方法都提供重载方法。
(1)基本数据类型分析
Gson Gson=new Gson();
int i=gson.fromJson('100 ',int . class);//100
double d=gson . from JSON(' 99.99 ',double . class);//99.99
boolean b=gson.fromJson('true ',boolean . class);//真
String str=gson . from JSON(' String ',String . class);//字符串
(2)基本数据类型的生成
Gson Gson=new Gson();
string JSON number=gson . tojson(100);//100
string jsonBoolean=gson . tojson(false);//假
String JSON String=gson . tojson(' String ');//'字符串'
(3)3)POJO类的生成和分析
公共类用户{
//省略其他
公共字符串名称;
公共int age
公共字符串emailAddress
}
生成JSON:
Gson Gson=new Gson();
用户user=新用户('张三',24);
String jsonObject=gson.toJson(用户);//{ '姓名':'张三木斗','年龄':24}
解析JSON:
Gson Gson=new Gson();
String jsonString='{'name ':'张三','年龄':24 } ';
user user=gson . from JSON(JSON string,user . class);
二、属性重命名 @SerializedName 注解的使用
从上面POJO的生成和分析可以看出,json字段和值的名称和类型是一一对应的,但也有一定的容错机制(比如第一个例子的第三行,字符串的99.99转换成double类型),但有时也会出现一些不协调的情况,比如:
预期的json格式:{ '姓名':'张三','年龄':24,'电子邮件地址':'张三@ ceshi.com'}
实际:{ '姓名':'张三','年龄':24,' email _ address ':'张三@ ceshi.com'}
Gson在序列化和反序列化时需要使用反射。一般各种库都会把注释放在注释包下。打开源代码,com.google.gson包下有一个annotations,里面包含一个SerializedName的annotation类。与json中的属性email_address对应的POJO的属性变成了:
@SerializedName('电子邮件地址')
公共字符串emailAddress
为POJO字段提供备用属性名:SerializedName批注提供了两个属性,其中一个使用,另一个属性alternate接收字符串数组。
注意:替代要求版本2.4。
@ serialized name(value=' email address ',alternate={'email ','电子邮件地址' })
公共字符串emailAddress
//当三个属性(email_address,email,emailAddress)中的任意一个出现时,都能得到正确的结果。
//多种情况同时发生时,以最后一次发生的值为准。
Gson Gson=new Gson();
JSON=' {'name ':'张三Kidou ','年龄':24,'邮箱':'张三@ ceshi.com ','邮箱':'张三_ 2 @ ceshi.com ','邮箱_地址':'张三_ 3 @史策
User user=gson.fromJson(json,user . class);
system . out . println(user . email address);//zhangsan_3@example.com
三、Gson中使用泛型
比如:JSON字符串数组:['Android ',' Java ',' PHP']
通过Gson解析这个json时,一般有两种方式:使用数组和使用List;列表更方便添加和删除,所以实际使用的列表更多。
数组很简单:
Gson Gson=new Gson();
String jsonArray='['Android ',' Java ',' PHP ']';
String[]strings=gson . from JSON(JSON array,String[]。类);
对于列表,不可能直接更改字符串[]。上面代码中的class到ListString.class .对于Java来说,只有一个ListString和ListUser的字节码文件,就是List.class,这是使用Java泛型时要注意的问题。通用擦除。
为了解决的上面的问题,Gson提供了TypeToken来实现对泛型的支持,所以将以上的数据解析为列表字符串时需要这样写
Gson Gson=new Gson();
String jsonArray='['Android ',' Java ',' PHP ']';
string[]string=gson。来自JSON(JSON数组,String[].类);
ListString字符串list=gson。from JSON(JSON数组,new TypeTokenListString() {} .getType());
//TypeToken的构造方法是保护修饰的,所以上面才会写成new TypeTokenListString() {} .getType()而不是新的TypeTokenListString().getType()
泛型解析对接口波乔的设计影响
泛型的引入可以减少无关的代码:
{ '代码':' 0 ','消息':'成功','数据':{}}
{'code':'0 ',' message':'success ',' data':[]}
我们真正需要的数据所包含的数据,而密码只使用一次,消息则几乎不用,如果Gson不支持泛型或不知道Gson支持泛型的同学一定会这么定义波乔
公共类用户响应{
公共(同Internationalorganizations)国际组织代码;
公共字符串消息;
公共用户数据;
}
当其它接口的时候又重新定义一个XXResponse将数据的类型改成XX,很明显代码,和消息被重复定义了多次,通过泛型可以将密码和消息字段抽取到一个结果的类中,这样只需要编写数据字段所对应的波乔即可:
公共类结果T {
公共(同Internationalorganizations)国际组织代码;
公共字符串消息;
公开测试数据;
}
//对于数据字段是用户时则可以写为结果用户,当是个列表的时候为结果列表用户
四、Gson的流式反序列化
(1)自动方式
Gson提供了fromJson()和托伊森两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法
Gson.toJson(对象);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);
(2)手动方式:手动的方式就是使用溪流包下的JsonReader类来手动实现反序列化,和机器人中使用拉解析可扩展标记语言是比较类似的
字符串json='{'name ':'张三,'年龄':' 24 ' } ';
User User=new User();
JSON reader reader=新JSON reader(新字符串读取器(JSON));
读者。begin object();
while (reader.hasNext()) {
字符串s=阅读器。next name();
开关{
案例"名称":
用户。名称=读者。nextstring();
打破;
案例"年龄":
用户。年龄=读者。nextint();//自动转换
打破;
案例"电子邮件":
用户。电子邮件=读者。nextstring();
打破;
}
}
读者。end object();//引发IOException
系统。出去。println(用户。姓名);//张三
系统。出去。println(用户。年龄);//24
系统。出去。println(用户。邮箱);//zhangsan@ceshi.com
自动方式最终都是通过JsonReader来实现的,如果第一个参数是线类型,那么Gson会创建一个字符串阅读器转换成流操作
五、Gson的流式序列化
(1)自动方式
Gson.toJson方法列表
//PrintStream(System.out)、StringBuilder、StringBuffer和*作家都实现了可追加的接口。
Gson Gson=new Gson();
用户用户=新用户('张三,24,'张三@史策。com’);
gson.toJson(用户,系统。out);
(2)手动方式
JsonWriter writer=new JsonWriter(new output streamwriter(system。out));
writer.beginObject() //抛出IOException。名称('名称')。值('张三)。姓名("年龄")。值(24)。姓名("电子邮件")。nullValue() //演示空。end object();//引发IOException
作家。flush();//引发IOException
//{ '姓名':'张三,'年龄':24,'电子邮件:空}
//除了开始对象、结束对象还有beginArray和恩达里,两者可以相互嵌套,注意配对即可beginArray后不可以调用名字方法,同样开始对象后在调用价值之前必须要调用名字方法。
六、 使用GsonBuilder导出null值、格式化输出、日期时间
一般情况下Gson类提供的应用程序接口已经能满足大部分的使用场景,但有时需要更多特殊、强大的功能时,这时候就引入一个新的类GsonBuilder。
GsonBuilder从名上也能知道是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson
GsonBuilder用法:
//各种配置//生成配置好的Gson
Gson gson=new GsonBuilder().create();
(1)默认情况下,gson不移动具有空值的键,例如:
公共类用户{
公共字符串名称;
公共int age
//省略
公共字符串电子邮件;
}
Gson Gson=new Gson();
用户user=新用户(张三',24);
system . out . println(gson . tojson(user));//{ '姓名':'张三','年龄':24}
//电子邮件字段没有出现在json中。当需要在调试期间导出完整的json字符串时,或者当API要求任何值都不能为Null时,这将非常有用。
用法:
Gson gson=new GsonBuilder()。serializeNulls()。create();
用户user=新用户('张三',24);
system . out . println(gson . tojson(user));//{ '姓名':'张三','年龄':24,'电子邮件':null}
打印格式、日期和时间及其他:
Gson gson=new GsonBuilder()
//序列化空值。serializeNulls()
//设置日期时间格式,有2个重载方法。
//对序列化和反序列化都有效。setDateFormat('yyyy-MM-dd ')
//禁用此序列化内部类。disableInnerClassSerialization()
//生成不可执行的Json (more)]} '这4个字符)。generateNonExecutableJson()
//禁止转义html标记。disableHtmlEscaping()
//打印格式。setPrettyPrinting()。create();
//:内部类和嵌套类的区别
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。