gson的用法,Gson使用

gson的用法,Gson使用,Java中Gson的使用详解

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: