Gson详解

Android Gson使用详解 Json数组 与 List//Json数组 转为 ListSystem.out.println("\nJson数组 转为 List: “);//List 转为 Json数组System.out.println(”\nList 转为 Json数组: "); 阅读详情

我平时使用到的Json库主要是Gson,为了更 进一步了解我对Gson做了比较详细的学习

Gson的API设计

首先了解一下Gson的关于json的主要API,最顶层的类是JsonElement(表示这是一个Json对象),子类有如下几个

  1、JsonArray 数组形式,可以理解为List类型的数据,如 [  {'a':'a'}, {'b','b'} ]等

2、JsonNull 指null类型

3、JsonObject:指的是标准的json对象{'a':'a' },并且提供了一系列方法,如添加属性 jsonObject.addProperty("b","b") , 还可以添加其他JsonElement,如jsonObject.add("a",jsonElement),这里jsonElement可以为任何JsonElement及其子类

  4、JsonPrimitive:指原始类型 


Gson反序列化时(如果有泛型)是如何获取泛型的具体类型的

我们知道java在运行的时候是用了泛型擦除的机制,在运行期,其实所有泛型都是Object类型的,我们如果设想自己想要实现反序列化(也就是将字符串转为对象)我们可能会这样

1、解析数据 如果为 [ {  'username' :' abc123'  , 'password': '666'' } ] ,得到键值对如 :username = abc123等

2、拿到要转化对象的类型如果为  List<Person> aa = new ArrayList<Person>();, 我们可能想象有一个方法可以通过aa.getClass()然后通过class来获得Person类型,但是这里jdk里面是没有这样的方法的,那我们如何获得呢

Type type = new TypeToken<List<Person>>(){}.getType();

通过Type就能获得class了,其实这里是利用了jdk中class的一个方法getGenericSuperclass();可以通过class获得当前类的父类的泛型参数类型,了解了原理我们再看

Gson的实现,其实是创建了一个匿名内部类,这个类的父类是TypeToken,而参数类型就是我们想要转换的类型


Gson使用篇

 Gson的使用很简单,将对象转化为json

Gson g  = new Gson();
g.toJson(object);

自定义Gson

1 如果想要得到自定义的效果(如想要自定义日期格式)

可以这样常见gson

Gson g = new GsonBuilder().setDateFormat("yyyy-MM-dd hh-mm-ss ").create();


2 自定义某个字段的输出名称

如果有一个类 

class Person{
  private String id;
  private String username;
  private String desc;
}


在序列化的时候,我们想要将id变为 person_id,username变为 uname,我们可以设置fieldNamingStrategy(字段命名策略)

自定义命名策略需要实现FieldNamingStrategy接口,然后实现里面的translateName方法

class PersonFieldNamingStrategy{
public String translatename(Field f){
if(f.getName().equals("id"))return "person_id";
if(f.getName().equals("username")) return "uname";
   }
}


gson在对字段进行序列化的时候都会调用translateName方法,我们就可以再这里进行字段名的修改,

其实修改字段序列化名称还有一种比较简单的方法,那就是给对象加上注解,如

@SerializedName("person_id")
private String id;

这样在序列化时就会生成  {'person_id' : '001'}


3 如果序列化时想要排除某些字段

拿上面的Person举例,如果我们序列化时想要排除id字段

自定义排除策略,这需要实现ExcludeStrategy

class PersonExcludeStrategy implements ExcludeStrategy{
//如果不想序列化某个类就在这里返回true
  public boolean shouldSkipClass(Class<?> arg0) {
  return false;
 }
//如果不想序列化某个字段
public boolean shouldSkipField(FieldAttributes f) {
   if(f.getName().equals("id"))return true;
   return false;
  }
}


这样序列化就能排除id字段 , 如果字段为 tranisent,则不会序列化


4 自定义序列化器,和反序列化器

如果想要更灵活的方式来控制序列化和反序列化,我们就要自定义自己的Serializer和Deserializer了

自定义Serializer(序列化器)

class PersonSerializer  implements JsonSerializer<Person>{
   public JsonElement serialize(Person p, Type type,JsonSerializationContext context) {
//在这里返回任何类型的JsonElement,gson会直接序列化这里返回的jsonElement
 }
}

如果要使用这个Serializer,我们需要注册

Gson g = new GsonBuilder().registerTypeAdapter(Person.class,PersonSerializer)

反序列化器也是差不多,需要实现JsonDeserializer

class PersonDeserializer implements JsonDeserializer<Person>{
	public Person deserialize(JsonElement elt, Type type,JsonDeserializationContext context) throws JsonParseException {
	if(elt.isJsonObject()){
	JsonObject  j  = (JsonObject) elt;
	Person p = (Person)type.getClass().newInstance();
	p.setUsername(  j.getProperty("username") .getAsString()  )  ;
}
}
}
注册反序列化器

Gson g = new GsonBuilder().registerTypeAdapter(Person.class, PersonDeserializer);


这里说了更多关gson使用的 介绍 http://blog.youkuaiyun.com/zxhoo/article/details/21471005

http://blog.youkuaiyun.com/canchew/article/details/7545363

SIMetrix教程-001.SIMetrix软件简介与安装   由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优 阅读详情

相关推荐

SPAD单光子雪崩二极管:从基础原理到前沿应用

本文深入解析SPAD单光子雪崩二极管的基础原理、硬件实现关键及核心性能参数,并探讨其在激光雷达、量子通信和生物医学成像等前沿领域的创新应用。SPAD凭借超高灵敏度和精确的时间分辨率,正在推动自动驾驶、量子技术和医学诊断等领域的革命性发展。

weixin_30335575的博客 663

Java 中 Gson的使用

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等 一、Gson的基本用法 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法 1)基本数据...

hengdeveloper 1389

Matlab实战:手把手教你用Zernike多项式模拟光学像差(附完整代码)

本文详细介绍了如何在Matlab中使用Zernike多项式模拟光学像差,包括基础理论、不同排序系统的实现、完整代码示例以及高级应用技巧。通过Zernike多项式,可以有效地描述和分析光学系统中的波前畸变,适用于望远镜校正、眼科光学等多个领域。

weixin_42523720的博客 161

Gson详解(一)

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。而JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。引入依赖:</</</</二.Gson使用2.1Gson的创建Gson的创建方式一:直接new Gson对象。

lw的博客 4009

【无机纳米材料科研制图——OriginLab 0205】Origin对BET吸附/脱附曲线及孔径分布制图...

此篇,我们来分享如何对BET数据进行处理和制图。 一、等温吸脱附曲线绘制 1)找到等温吸脱附文件。 一半来说,对一个样品测一次BET,会产生很多数据,具体因仪器而异。我这里的数据主要有两个文件夹,一个脱附,一个吸附,吸附文件夹中多了一个等温吸脱附的文件夹。而这...

XD_Yangf的博客 803

【老生谈算法】可视化通道流中瞬时涡量场的算法实现与MATLAB源码分析——瞬时涡量场

本文旨在探讨可视化通道流中瞬时涡量场的方法,并通过MATLAB编程实现这一过程。涡量场作为描述流体旋涡强度和方向的重要物理量,对于理解复杂流体运动具有重要意义。本文首先介绍了涡量场的基本概念,随后详细阐述了从测量数据收集到涡量场可视化的完整流程,并给出了相应的MATLAB源码。通过实际运行该源码,我们展示了涡量场的可视化结果,并讨论了其在流动结构识别和动力学行为理解中的应用。关键词: 涡量场;流体运动;MATLAB;可视化;PIV一、引言。

m0_53407570的博客 1125

Gson

https://blog.csdn.net/kakaxi1o1/article/details/79643399 Gson介绍:GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。特点: a...

s297485987的专栏 511

Xiaojie雷达之路---使用CCS创建一个毫米波雷达的工程(AWR1843)

前些天,在工具箱中下载了一个基于毫米波雷达(AWR1843)自动停车的案例,并成果导入CCS中,可以完美运行,但是如何新建一个新的工程呢?这篇文章就会对其进行讲述。

XiaoJie的博客 4550

Gson的详细使用

gson解析json的详细使用

qq_32035241的博客 4862

Unity游戏开发客户端面经——设计模式(初级)

Unity游戏开发客户端面经 之 设计模式 篇

Sea3752的博客 9431

Android软键盘系统深度解析:架构、原理与实现

Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、

保持专注,保持热爱 115

JSON教程之GSON基本解析(Java-Gson)

使用Gson我们可以很方便把一个自定义Java对象转换为Gson。但是,我们也需要知道一些Java基本对象和Gson之间的转换,我们这里就说一些基本Java对象和Gson直接的转换。 1、构建JsonObject对象 Json字符串中,如果想要显示出来是 { } 这样格式的,就必须构建JsonObject对象 eg: JsonObject spanObj=new JsonObject();

楚门的世界 9113

外部PLC触发VisionMaster多流程运行

上一讲,介绍了海康VisionMaster与西门子PLC1200进行S7通信。在前一讲的基础上,讲解如何通过PLC触发,实现VisionMaster的多流程运行。

haier123888的博客 4653

GSON详解

GSON GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发。在这里,我们主要讲解的是利用GSON来操作java对象和json数据之间的相互转换,包括了常见的对象序列化和反序列化的知识。 一、前言 因为json有2种类型: 一种是对象,object -> {key:value,key:value,…} 。 另一种是数组,array -> [value,value,…] 。 所以针对这两种类型,来展开对json数据的操作。 GSON在解析json的时候,大体上有2种类型

qq_43842093的博客 8667

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Gson的用法详解

关于gson的一些使用详解

m0_64148419的博客 1万+

Google Gson用法详解

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。

三分恶的博客 4724

Gson 使用详解

Gson 是 Google 提供的 Java 库,用于。

echo_123qq的博客 1052

使用Gson详解

解析json: Gson gson=new Gson(); Person person=gson.fromJson(jsonData,Person.class); 解析json数组: 需要用到TypeToken将期望解析成的数据类型传入到fromJson()方法中: List people=gson.fromJson(jsonData,newTypeToken>(){}.getType(

姚佳伟 3317

android gson教程,Android Gson使用详解

一、Gson的基本用法1.1、Gson对象在进行序列化与反序列操作前,需要先实例化一个com .google.gson.Gson对象,获取 Gson 对象的方法有两种//通过构造函数来获取Gsongson=newGson();//通过GsonBuilder来获取,可以进行多项特殊配置Gsongson=newGsonBuilder().create();1.2...

weixin_35994939的博客 3240

JsonObject和Gson详解

参考文件:http://www.cnblogs.com/xwdreamer/archive/2011/12/16/2296904.html 一、JsonObject 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jarcommons-beanutils.jarcommons-collections.

android2me的专栏 1万+

Google Gson 使用详解

Gson Summary Java解析Json最常用的类库有:google 的Gson、阿里巴巴的FastJson、以及 Jackson。这些都是非常优秀而且常用的库。GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库,可以快速的将一个Json字符转成一个Java对象,或者将一个Java 对象转化为Jso...

weixin_36498094的博客 2860

java gson_Java中Gson的使用详解

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法(1)基本数据类型...

weixin_31539461的博客 574
上一篇: hibernate缓存
下一篇: 让vim编辑时不生成副本文件
程序员A
博客等级 码龄15年 27粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值