Gson解析之自定义序列化和反序列化

2024-06-09 14:58

本文主要是介绍Gson解析之自定义序列化和反序列化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在解析Gson过程正经常遇到这样的问题:
在后端给的接口文档中,对于给定的字段A其数据类型是X,但是在实际情况下,后端有可能返回的字段A是数据类型Y,这个时候就hehe了,gson抛异常,如果不捕获程序就直接奔溃了;捕获之后这条数据也会因为这个字段的解析失败而最终作废。

对于这样的问题,android自带的json解析类,是可以避免的,直接把该类型作为X。但是android自带的解析类在写起来比较吃力。。。所以暂时没往这个方向考虑。

这个时候如果继续使用gson解析,就需要自定义序列化和反序列化的解析器:

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;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;public class StringConverter implements JsonSerializer<String>,JsonDeserializer<String> {public JsonElement serialize(String src, Type typeOfSrc,JsonSerializationContext context) {if (src == null) {return new JsonPrimitive("");} else {return new JsonPrimitive(src.toString());}}public String deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {try{String str = json.getAsJsonPrimitive().getAsString();System.out.println("-----str-----"+str); return str;}catch (Exception e){return "";}
//      return json.getAsJsonPrimitive().getAsString();}
}

调用代码:

public static List<Person> changeGsonToListMaps(String gsonString) {  List<Person> list = null;  
//        Gson gson = new Gson();  GsonBuilder gb = new GsonBuilder(); gb.registerTypeAdapter(String.class, new StringConverter()); gb.registerTypeAdapter(Integer.class, new IntegerConverter()); Gson gson = gb.create();list = gson.fromJson(gsonString,  new TypeToken<List<Person>>() {  }.getType());  return list;  }

GsonBuilder com.google.gson.GsonBuilder.registerTypeAdapter(Type arg0, Object arg1)
在方法里面,用过registerTypeAdapter调用检查,过滤了指定类型Type,只用上面的自定义解析器解析。

利用这个特性,可以解决很多有趣的问题:
1、Gson解析相同字段但不同类型的JSON;
2、防止后端给的字段类型不是自己想要的,而导致数据无效;
3、对数据进行自定义处理等。
Demo下载链接:http://download.csdn.net/detail/u011484134/9195555 免积分下载哦

最后顺便说一下,最初我使用的方法:将可能出现相同字段名称但不同类型的JSON字段x,在写Bean类的时候,我把他写成了Object类,在后面解析下来后利用instanceof 判断一下,就可以轻松搞定。两种方法自行选择。

参考链接:
Android中的JSON解析方式 http://blog.csdn.net/qi_ruihua/article/details/22050389
关于Gson解析json数据时如果属性值为null则会报空的问题 http://segmentfault.com/q/1010000002748900
Gson解析相同字段但不同类型的JSON http://segmentfault.com/q/1010000002779358
Gson帮助文档 http://www.haoxiqiang.info/blog/20150608-GsonExamples.html

这篇关于Gson解析之自定义序列化和反序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045504

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三