`
Josh_Persistence
  • 浏览: 1650044 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

<二> Google Gson 转换Json字符串和对象(日期,枚举的转化)

    博客分类:
  • JSON
阅读更多

例子肯定能运行成功,考虑到面向对象,所以多写了几个类。

 

一、日期的转换需要在Create GsonBuilder时注册日期的格式。

 

二、对于枚举类,如果是默认转换,则不需要做任何操作,Gson会将枚举类转换为字符串。但如果需要自定义规则来进行枚举类和字符串的转换,则需要自定义相关的类实现JsonSerializer和JsonDeserializer类。

 

三、含有枚举类型的Java Object:NucleonEvent

 

/**
 * 
 */
package com.ebay.montage.pm.model;

import java.util.List;
import java.util.Map;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@ebay.com
 */
public class NucleonEvent {
	
	private String id;
	
	private String host;
	
	private String odbFunction;
	
	private String source;
	
	private String format;
	
	private String classification;
	
	private long detectionTime;
	
	private long reportedTime;
	
	private Severity severity;
	
	private NucleonEventType type;
	
	private NucleonMetadata metadata;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public NucleonEventType getType() {
		return type;
	}

	public void setType(NucleonEventType type) {
		this.type = type;
	}
	
	public enum NucleonEventType {
		
		nwmon_checkMem,nwmon_checkCPU_busyio;

	}
	
	public enum Severity {
		low;
	}
	
	public static class NucleonMetadata {
		private boolean passed;
		
		private String name;
		
		private List<Map<String, String>> msgs;
		
		private Map<String , Object> resultDataMap;

		public boolean isPassed() {
			return passed;
		}

		public void setPassed(boolean passed) {
			this.passed = passed;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public List<Map<String, String>> getMsgs() {
			return msgs;
		}

		public void setMsgs(List<Map<String, String>> msgs) {
			this.msgs = msgs;
		}

		public Map<String, Object> getResultDataMap() {
			return resultDataMap;
		}

		public void setResultDataMap(Map<String, Object> resultDataMap) {
			this.resultDataMap = resultDataMap;
		}
		
		
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getOdbFunction() {
		return odbFunction;
	}

	public void setOdbFunction(String odbFunction) {
		this.odbFunction = odbFunction;
	}

	public String getSource() {
		return source;
	}

	public void setSource(String source) {
		this.source = source;
	}

	public String getClassification() {
		return classification;
	}

	public void setClassification(String classification) {
		this.classification = classification;
	}

	public long getDetectionTime() {
		return detectionTime;
	}

	public void setDetectionTime(long detectionTime) {
		this.detectionTime = detectionTime;
	}

	public long getReportedTime() {
		return reportedTime;
	}

	public void setReportedTime(long reportedTime) {
		this.reportedTime = reportedTime;
	}

	public Severity getSeverity() {
		return severity;
	}

	public void setSeverity(Severity severity) {
		this.severity = severity;
	}

	public String getFormat() {
		return format;
	}

	public void setFormat(String format) {
		this.format = format;
	}

	public NucleonMetadata getMetadata() {
		return metadata;
	}

	public void setMetadata(NucleonMetadata metadata) {
		this.metadata = metadata;
	}

	@Override
	public String toString() {
		return "NucleonEvent [id=" + id + ", host=" + host + ", odbFunction="
				+ odbFunction + ", source=" + source + ", format=" + format
				+ ", classification=" + classification + ", detectionTime="
				+ detectionTime + ", reportedTime=" + reportedTime
				+ ", severity=" + severity + ", type=" + type + ", metadata="
				+ metadata.getName() + ":" + metadata.isPassed() + metadata.getMsgs() + "]";
	}

	

	
}

 

 

四、抽象的转换类: EventDataparser

 

/**
 * 
 */
package com.ebay.montage.pm.handler;

import com.ebay.montage.pm.model.NucleonEvent;
import com.ebay.montage.pm.model.NucleonEvent.NucleonEventType;
import com.ebay.montage.pm.utils.DateUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@ebay.com
 */
public abstract class EventDataParser {
	
	public static Gson createGson() {
		GsonBuilder builder = new GsonBuilder();
		builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
		builder.registerTypeAdapter(NucleonEventType.class, new NucleonEventTypeSerializer());
		
		Gson gson = builder.create();
		return gson;
	}

	/**
	 * Parse the given JSON String to NucleonEvent
	 * @param jsonStr
	 * @return
	 */
	public abstract NucleonEvent fromGson(String jsonStr);
	
	/**
	 * Parse the NucleonEvent to JSON String
	 * @return
	 */
	public abstract String toGson(NucleonEvent event);
}

 

如果需要使用自定义的日期转换器,需要自定义相应的Adapter 并注册相关的Adapter,如下面的Adapter将会处理所有的类型为Calendar的字段:

public static Gson createGson() {
		GsonBuilder builder = new GsonBuilder();
		builder.registerTypeAdapter(NucleonEventType.class, new NucleonEventTypeAdapter());
		builder.registerTypeAdapter(Calendar.class, new NucleonEventCalendarAdapter());
		builder.setDateFormat(DateUtils.MIDDLE_LINE_TIMESTAMP);
		
		Gson gson = builder.create();
		return gson;
	}

 

package com.ebay.montage.pm.handler;

import java.lang.reflect.Type;
import java.util.Calendar;

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;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@ebay.com
 */
public class NucleonEventCalendarAdapter implements JsonSerializer<Calendar>,
		JsonDeserializer<Calendar> {

	public Calendar deserialize(JsonElement json, Type arg1,
			JsonDeserializationContext arg2) throws JsonParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(json.getAsJsonPrimitive().getAsLong());
		return calendar;
	}

	public JsonElement serialize(Calendar calendar, Type arg1,
			JsonSerializationContext arg2) {
		return new JsonPrimitive(Long.valueOf(calendar.getTimeInMillis()));
	}

	

}

 

五、实际进行转换的类

 

/**
 * 
 */
package com.ebay.montage.pm.handler;

import com.ebay.montage.pm.model.NucleonEvent;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@ebay.com
 */
public class NucleonEventDataParser extends EventDataParser {

	@Override
	public NucleonEvent fromGson(String jsonStr) {
		return NucleonEventDataParser.createGson().fromJson(jsonStr, NucleonEvent.class);
	}

	@Override
	public String toGson(NucleonEvent event) {
		return NucleonEventDataParser.createGson().toJson(event);
	}

}

 

六、 上面的NucleonEvent中有两个枚举类:NucleonEventType 和 NucleonMetadata

我们只对NucleonEventType进行自定义的枚举类和json的转换,而对NucleonMetadata采用默认的转换。

package com.ebay.montage.pm.handler;

import java.lang.reflect.Type;

import com.ebay.montage.pm.model.NucleonEvent.NucleonEventType;
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;

/**
 * 
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@ebay.com
 */
public class NucleonEventTypeSerializer implements JsonSerializer<NucleonEventType>,
		JsonDeserializer<NucleonEventType> {

	/**
	 * JSON to Object
	 */
	public NucleonEventType deserialize(JsonElement json, Type arg1,
			JsonDeserializationContext arg2) throws JsonParseException {
        return NucleonEventType.valueOf(json.getAsString()) ; 
	}

	/**
	 * Object to JSON
	 */
	public JsonElement serialize(NucleonEventType type, Type arg1,
			JsonSerializationContext arg2) {
		return new JsonPrimitive(type.name());
	}


}

 

 

七、Unit Test类

 

/**
 * 
 */
package com.ebay.montage.pm;


import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.ebay.montage.pm.handler.NucleonEventDataParser;
import com.ebay.montage.pm.model.NucleonEvent;
import com.ebay.montage.pm.model.NucleonEvent.NucleonEventType;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  swang6@eaby.com
 */
public class TestNucleonEventParser {

	private static String json;
	
	@BeforeClass
	public static void init() {
		json = "{\"id\": \"eventId\", \"type\":\"nwmon_checkCPU_busyio\", "
				+ "\"format\" : \"normalizedEvent\", \"detectionTime\": \"23424234234\", "
				+ " \"severity\":\"low\", "
				+ "\"metadata\":{\"passed\": true,\"name\": \"Recent Changes Check\", \"msgs\": [{\"data\": \"<HTML Allowed>\"}, {\"eve\": \"<Pdf Allowed>\"}]}}";
	}
	
	@Test
	public void fromGson() {
		NucleonEvent event = new NucleonEventDataParser().fromGson(json);
		
		Assert.assertEquals("eventId", event.getId());
		Assert.assertEquals("nwmon_checkCPU_busyio", event.getType().toString());
		
		System.out.println(event.toString());
	}
	
	@Test 
	public void toGson() {
		NucleonEvent event = new NucleonEvent();
		
		event.setId("eventId2");
		event.setType(NucleonEventType.nwmon_checkCPU_busyio);
		
		Assert.assertTrue(new NucleonEventDataParser().toGson(event).contains("eventId2"));
	}
}

 

 

 

 

1
0
分享到:
评论
1 楼 sunshine_bean 2016-02-23  
谢谢

相关推荐

    基于微信小程序的在线办公小程序答辩PPT.pptx

    基于微信小程序的在线办公小程序答辩PPT.pptx

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的电影交流平台答辩PPT.pptx

    基于微信小程序的电影交流平台答辩PPT.pptx

    计算机字符编码GB18030.PDF

    计算机字符编码GB18030

    Hive 操作基础(进阶版)多级分区数据文件2

    Hive 操作基础(进阶版)多级分区数据文件2

    基于java的贫困生管理系统答辩PPT.pptx

    基于java的贫困生管理系统答辩PPT.pptx

    pandas-2.1.4-cp312-cp312-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    TA_Lib轮子无需编译-TA_Lib-0.4.18-cp38-cp38-win32.whl.zip

    TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便

    课设毕设基于SpringBoot+Vue的瑜伽体验课预约系统源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

    tornado-6.2b2.tar.gz

    tornado-6.2b2.tar.gz

    javawe论坛项目 原生技术

    javawe论坛项目 原生技术

    tornado-6.2b1-cp310-cp310-macosx_10_9_universal2.whl

    tornado-6.2b1-cp310-cp310-macosx_10_9_universal2.whl

    基于司机信用评价的货运管理系统(springboot+vue+mysql+说明文档).zip

    随着物流行业的快速发展,货运管理变得愈发重要。为了提高货运效率,确保货物安全,我们开发了这款基于司机信用评价的货运管理系统。 该系统主要包含了货物信息管理、订单评价管理、货主管理等多个功能模块。在货物信息管理模块中,用户可以查看和管理货物的详细信息,包括货物名称、规格、装车状态、运输状态以及卸货状态等,方便用户随时掌握货物的动态。 订单评价管理模块是该系统的核心之一,它允许货主对司机的服务进行评价,系统会根据评价数据对司机进行信用评分。这一功能不仅有助于提升司机的服务质量,还能为货主提供更加可靠的货运选择。 此外,货主管理模块提供了货主信息的录入、修改和查询等功能,方便用户管理自己的货主资料。系统界面简洁明了,以蓝色为主色调,设计现代且专业,为用户提供了良好的使用体验。 通过该系统,用户可以轻松实现货物信息的查看和管理,对司机的服务进行评价,提高货运效率和服务质量。同时,系统也为司机提供了一个展示自我、提升信用的平台,有助于推动物流行业的健康发展。

    毕业生交流学习平台 SSM毕业设计 附带论文.zip

    毕业生交流学习平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的广场舞团答辩PPT.pptx

    基于java的广场舞团答辩PPT.pptx

    基于java的基于SSM的校园音乐平台答辩PPT.pptx

    基于java的基于SSM的校园音乐平台答辩PPT.pptx

    安装包JIRATimeSLA

    Jira插件安装包

    【java毕业设计】基于图像识别与分类的中国蛇类识别系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

    tornado-6.2b2-cp37-abi3-win_amd64.whl

    tornado-6.2b2-cp37-abi3-win_amd64.whl

Global site tag (gtag.js) - Google Analytics