`
Josh_Persistence
  • 浏览: 1653557 次
  • 性别: 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  
谢谢

相关推荐

    Gson解析JSON数据的入门级源码

    在Java开发中,Gson库是一个非常常用的工具,它由Google提供,用于将Java对象转换为JSON字符串,以及将JSON字符串反序列化回相应的Java对象。这个“Gson解析JSON数据的入门级源码”应该包含了一些基础示例,帮助初学...

    利用Gson.jar快速将对象类型转换为Json

    Gson是Google提供的一款强大的库,它允许我们轻松地将Java对象转换为JSON字符串,反之亦然。本文将深入探讨如何利用Gson.jar来实现对象到JSON的快速转换。 1. **Gson库介绍** Gson是Google提供的一个开源项目,它...

    net.sf.json.JSONObject实现Object对象与Json字符串的互转

    是Java开发中处理JSON数据的一个工具,它提供了一种方便的方式来转换Java对象和JSON字符串,使得数据交换变得更加简单。通过理解和熟练使用`JSONObject`,开发者可以更好地应对前后端交互的需求。

    复杂的json字符串解析(真实案例)

    Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之亦然。在解析复杂的JSON字符串时,Gson提供了强大的功能,包括对嵌套结构的支持和自定义类型适应。 首先,我们要了解JSON的基本结构。JSON...

    com.google.gson.Gson 2.8.1 2.8.2 jar包 gson

    5. **日期和时间处理**:Gson提供了内置的日期和时间解析策略,可以将日期对象转换为多种格式的JSON字符串,反之亦然。 6. **自定义序列化器和反序列化器**:开发者可以通过实现`JsonSerializer&lt;T&gt;`和`...

    gson和json

    Gson库的核心功能在于能够将Java对象转换为JSON字符串,同时也能将JSON字符串反序列化为对应的Java对象。这一特性使得Gson成为在Java应用中处理JSON数据的理想工具,尤其在服务器端和Android开发中。 使用Gson库的...

    gson包解析json 数据

    Gson的核心功能在于提供了一种简洁的方式来序列化和反序列化Java对象为JSON字符串。序列化是将Java对象转换为JSON的过程,而反序列化则是将JSON字符串恢复为等效的Java对象。这个过程对于网络通信、存储或显示JSON...

    gson解析json格式数据

    它使得Java对象可以轻松地转换成对应的JSON字符串,反之亦然。这个库在处理JSON格式的数据时非常方便,广泛应用于Android开发和服务器端的Java应用。 在Java中,Gson库的主要功能包括: 1. **序列化**:将Java对象...

    gson 2.7 用于转换Java对象和Json对象

    1. **序列化与反序列化**:Gson库的主要任务是将Java对象转换成JSON字符串(序列化),以及将JSON字符串解析为对应的Java对象(反序列化)。例如,你可以通过`Gson().toJson()`方法将一个Java对象转换成JSON,同时...

    Google之Gson库深度剖析及使用范本

    Gson是Google开发的一个开源库,其主要功能是将Java对象转换成JSON字符串,同时也可以将JSON字符串反序列化为Java对象。Gson通过简单的API设计,使得开发者能够轻松地在Java对象和JSON数据之间进行互转,极大地简化...

    阿里和谷歌的json的jar包

    `toJson()`方法用于将Java对象转化为JSON字符串,而`fromJson()`方法则用于将JSON字符串反序列化为Java对象。Gson支持多种复杂的数据结构,如自定义类型、泛型、枚举等,使得在处理JSON数据时非常灵活。 接下来,...

    gson源码与文档,集成多枚举类型统一序列化/反序列化处理

    在Android开发中,Gson库是一个非常常用的工具,它能够帮助我们将Java对象转换为JSON字符串,反之亦然。本文将深入探讨如何利用Gson库进行多枚举类型的统一序列化和反序列化处理,以此避免为每个枚举类型单独创建...

    Gson 枚举类型的统一序列化/反序列化处理

    默认情况下,Gson会根据枚举的名称(即`toString()`方法返回的字符串)将其转换为JSON字符串,但在某些场景下,这可能不够灵活或精确。例如,你可能希望枚举值与数据库中的字段对应,或者需要自定义的JSON表示形式。...

    gson[json格式转换].zip

    使用Gson,你可以直接将Java对象转换为JSON字符串。只需调用`Gson().toJson(object)`即可。例如,一个简单的Java对象: ```java class Person { String name; int age; } Person person = new Person(); ...

    我的gson学习例子

    在Java开发中,Gson库是一个非常重要的工具,它由Google提供,用于将Java对象转换为JSON字符串,以及将JSON数据解析回等效的Java对象。这个“我的gson学习例子”显然是一份关于如何使用Gson进行JSON操作的学习资料。...

    Google的json数据转换的jar包gson-2.2.4

    6. **枚举支持**:Gson能够自动处理枚举类型,将其转换为JSON字符串和从JSON恢复。 7. **运行时类型信息**:Gson可以保留原始类型信息,即使在反序列化时类型不明确也能正确处理。 8. **性能优化**:Gson经过精心...

    gson-2.8.5 开发包

    Gson是Google开发的一个Java库,用于将Java对象转换为JSON字符串,以及将JSON内容解析回等效的Java对象。这个“gson-2.8.5”开发包包含了Gson库的最新版本,适用于Java开发者,特别是那些需要在应用程序中处理JSON...

    谷歌 Gson2.8.0 依赖包、文档和源码

    例如,可以使用`Gson`类的`toJson()`方法将Java对象转换为JSON字符串,或者使用`fromJson()`方法将JSON字符串反序列化为Java对象。 其次,`gson-2.8.0-sources.jar`包含的是Gson库的源代码,这对于开发者来说非常有...

    Java四大json库gson+fastjson+jackson+json-lib

    Gson是Google提供的一个开源库,它能够将Java对象转换为JSON字符串,同时也能够将JSON数据转换回等效的Java对象。Gson的优点在于其简单易用的API和强大的功能,支持自定义序列化和反序列化的策略。它对于复杂类型的...

    Gson-2.2.4.jar包和源代码

    1. **对象到JSON字符串的序列化**:Gson提供`Gson.toJson()`方法,可以将任何Java对象转换为对应的JSON字符串。例如,一个简单的Java对象`Person`可以通过`Gson().toJson(person)`转换为JSON格式的字符串。 2. **...

Global site tag (gtag.js) - Google Analytics