`
conkeyn
  • 浏览: 1528969 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

自定义ObjectMapper

 
阅读更多

d

 

import java.io.IOException;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonTokenId;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer;

/**
 * 支持多种日期格式的解析
 */
@SuppressWarnings("deprecation")
class CustomDateDeseralizer extends UntypedObjectDeserializer {

  Logger logger = LoggerFactory.getLogger(getClass());

  private static final long serialVersionUID = -2275951539867772400L;

  @Override
  public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {

    if (jp.getCurrentTokenId() == JsonTokenId.ID_STRING) {
      try {
        return DateUtils.parseDate(jp.getText(),
            new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "MM/dd/yyyy",
                "yyyy.MM.dd G 'at' HH:mm:ss z", "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
                "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz"});
      } catch (Exception e) {
        logger.error(e.getMessage(), e);
        return super.deserialize(jp, ctxt);
      }
    } else {
      return super.deserialize(jp, ctxt);
    }
  }
}

 

import java.text.SimpleDateFormat;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;

/**
 * json与java对象之间转化器
 * 
 * @version 1.0.0
 * @since 2014年10月21日 下午3:11:39
 */
public final class JsonObjectMapper extends ObjectMapper {
  /** */
  private static final long serialVersionUID = 4563671462132723274L;

  public JsonObjectMapper() {
    super();
    // 从JSON到java object
    // 没有匹配的属性名称时不作失败处理
    this.configure(MapperFeature.AUTO_DETECT_FIELDS, true);

    // 反序列化
    // 禁止遇到空原始类型时抛出异常,用默认值代替。
    this.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
    this.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
    // 禁止遇到未知(新)属性时报错,支持兼容扩展
    this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    this.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    this.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
    // 按时间戳格式读取日期
    // this.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
    this.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
    this.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
    this.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    // 序列化
    // 禁止序列化空值
    this.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
    this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    this.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
    this.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);
    // 按时间戳格式生成日期
    // this.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
    this.configure(SerializationFeature.FLUSH_AFTER_WRITE_VALUE, true);
    this.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true);
    // 不包含空值属性
    this.setSerializationInclusion(Include.NON_EMPTY);
    this.setSerializationInclusion(Include.NON_NULL);
    // this.configure(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);
    // 是否缩放排列输出,默认false,有些场合为了便于排版阅读则需要对输出做缩放排列
    this.configure(SerializationFeature.INDENT_OUTPUT, false);
    // 设置全局的时间转化
    SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    this.setDateFormat(smt);
    // 设置日期反序列化组件
    SimpleModule dateDeserializerModule = new SimpleModule();
    dateDeserializerModule.addDeserializer(Object.class, new CustomDateDeseralizer());
    this.registerModule(dateDeserializerModule);
    // 注意:不要开启序列化和反序列化时为对象附加@class属性(坑)
    // this.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, As.PROPERTY);
  }

}

 

/**
 * 测试objectMapper特性
 * 
 * @version 1.0.0
 * @since 2015年3月2日 下午2:02:05
 * @param <T> 泛型参数
 */
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
//只包含非空属性
@JsonInclude(Include.NON_NULL)
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
public class Msg<T>
{
	
	@JsonProperty(required = false, value = "code")
	private String code;

	/** 消息内容 */
	@JsonProperty(required = false, value = "msg")
	private String msg;
	
	@JsonProperty(required = false, value = "name")
	String name;
	
	@JsonProperty(required = false, value = "payload")
	@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
	T payload;

	public T getPayload()
	{
		return payload;
	}

	public void setPayload(T payload)
	{
		this.payload = payload;
	}

	public String getName()
	{
		return name;
	}

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

	public String getCode()
	{
		return code;
	}

	public void setCode(String code)
	{
		this.code = code;
	}

	public String getMsg()
	{
		return msg;
	}

	public void setMsg(String msg)
	{
		this.msg = msg;
	}
}

 

/**
 * 测试objectMapper特性
 * 
 * @version 1.0.0
 * @since 2015年3月2日 下午2:02:05
 * @param <T> d
 */
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
public class TypeMap<T>
{
	@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
	//指示Map的value是使用@JsonTypeInfo进行解析
	Map<String, T> map = new HashMap<String, T>();

	public Map<String, T> getMap()
	{
		return map;
	}

	public void setMap(Map<String, T> map)
	{
		this.map = map;
	}

}

 

import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;

/**
 * 测试类
 * 
 * @version 1.0.0
 * @since 2015年2月5日 上午10:32:38
 */
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
public class User implements Serializable
{

	private String id;
	private String name;

	private int age;

	public String getId()
	{
		return id;
	}

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

	public String getName()
	{
		return name;
	}

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

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}
}

 

import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;

/**
 * 测试类
 * 
 * @version 1.0.0
 * @since 2015年2月5日 上午10:32:38
 */
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY)
public class User1 implements Serializable
{

	/** */
	private static final long serialVersionUID = 5723985672168696454L;
	private String id;
	private String name;

	private int age;

	public String getId()
	{
		return id;
	}

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

	public String getName()
	{
		return name;
	}

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

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}
}

 

 

d

分享到:
评论

相关推荐

    实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法)

    为了实现这一点,ObjectMapper允许开发者注册自定义的反序列化器(JsonDeserializer),以便对特定类型的字段进行特殊处理。这在处理复杂的数据结构或者需要进行特殊格式转换时尤为有用。例如,我们可以编写一个...

    ObjectMapper依赖的jar包

    除了基本的序列化和反序列化,`ObjectMapper`还支持更复杂的配置,如忽略未知属性、自定义日期格式、处理循环引用、以及配置序列化和反序列化的细节等。例如,如果你想忽略某个字段不参与序列化,可以这样设置: ``...

    swift-[iOS]ObjectMapper文档中文翻译

    `ObjectMapper`框架就是这样一个工具,它为Swift开发者提供了一个优雅的方式来映射JSON数据到自定义的模型对象,反之亦然。本文将深入探讨`ObjectMapper`的使用方法、功能和优势,以及如何将其集成到你的iOS项目中。...

    Java json工具类,jackson工具类,ObjectMapper工具类

    总结来说,`Java json工具类`如`Jackson`和`ObjectMapper`,以及开发者自定义的`JacksonUtils`工具类,是Java开发中处理JSON数据的关键工具。它们能够方便地将Java对象和JSON格式数据互相转换,同时提供了一系列高级...

    解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    **解决方法二:自定义ObjectMapper** 另一种方法是通过自定义`ObjectMapper`来实现全局的日期时间格式化。我们创建一个名为`JsonUtil`的工具类,继承`ObjectMapper`并注册自定义的`JsonSerializer`: ```java ...

    swift-ObjectMapper是一个用Swift编写的框架可以轻松地将模型对象转换为JSON和从JSON转换

    Swift-ObjectMapper是一个强大的工具,专门设计用于Swift编程语言,旨在简化JSON数据与自定义模型对象之间的转换过程。这个框架由Tristan Himmelman创建,它通过提供一个简洁的接口,使得开发者能够快速地实现序列化...

    ObjectMapper:一个用于将自定义类自动映射到XMLSOAP或从XMLSOAP自动映射的Java库

    使用ObjectMapper,您可以根据您的复杂对象自动构建XML和SOAP数据包,从而可能节省数百行的序列化代码。 ## Download在这里您可以下载最新的jar。 添加到您的项目中。 ## OMSerailizer ## OMSerailizer是一个...

    一个Alamofire扩展使用ObjectMapper迅速将JSON数据转换成对象.zip

    现在,我们可以直接在Alamofire的请求中使用`responseObject`方法,将JSON数据转换为自定义的对象。 ```swift Alamofire.request("https://api.example.com/users/1").responseObject { (response: Result, AFError...

    使用ObjectMapper框架进行json转换所需jar包和实例

    2. 自定义序列化和反序列化逻辑:使用`JsonSerializer`和`JsonDeserializer`实现自定义转换。 3. 配置选项:可以设置`ObjectMapper`的配置,如日期格式、忽略未知属性等。 4. 集合和Map的转换:直接支持List、Set、...

    举例讲解Java的Jackson库中ObjectMapper类的使用

    `ObjectMapper`还允许你通过各种方法进行自定义配置,例如: - `enableDefaultTyping()` 和 `disableDefaultTyping()` 可以控制是否启用默认类型化,用于处理未明确指定类型的序列化和反序列化。 - `configure()` ...

    springmvc自定义属性编辑器和参数解析器

    例如,如果要处理JSON字符串,可以使用Jackson库的`ObjectMapper`来反序列化。 - 可选地,实现`getAsText()`方法,如果需要在显示或回显时转换为特定格式的字符串。 - 使用`@InitBinder`注解和`WebDataBinder`的`...

    hello-jackson-objectmapper:使用Jackson ObjectMapper将JSON转换为Java对象的教程

    在Java开发中,处理JSON数据是一项常见的任务,而Jackson库是Java中广泛使用的JSON解析库之一,特别是它的ObjectMapper组件,能方便地实现JSON与Java对象之间的相互转换。本教程将深入探讨如何使用Jackson ...

    ObjectMapper:用 Swift 编写的简单 JSON 对象映射-开源

    ObjectMapper 是一个用 Swift 编写的框架,它使您可以轻松地将... ObjectMapper 还支持在映射过程中转换值的自定义转换。 要使用转换,只需使用 map["field_name"] 和 &lt;- 运算符右侧的您选择的转换创建一个元组。

    自定义JSONObject属性过滤注解

    例如,可以创建一个`MyEntity`实例,然后使用Jackson的`ObjectMapper`进行序列化和反序列化,观察结果是否符合预期。 总的来说,自定义JSONObject属性过滤注解是一种增强JSON序列化灵活性的方法,能够帮助我们在...

    不用注解的json字段忽略

    这时,我们可以利用Jackson的`@JsonIgnoreProperties`注解的变体,或者使用自定义的序列化和反序列化模块来实现这一目标。 首先,让我们探讨`@JsonIgnoreProperties`注解。此注解通常用于类级别,它允许我们指定一...

    ObjectMapper:用Swift编写的简单JSON对象映射

    映射期间的自定义转换 结构支持 基础 为了支持映射,一个类或结构只是需要实现Mappable协议,其中包括以下功能: init? ( map : Map) mutating func mapping ( map : Map) ObjectMapper使用&lt;-运算符定义每个...

    Java Servlet编写Json自定义数据接口

    ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(user); response.getWriter().write(jsonString); } } ``` 在这个例子中,我们创建了一个`UserDataServlet`,当...

    swift-MoyaObjectMapper的基本使用方法

    Swift中的Moya是一个非常流行的网络请求库,它简化了与Alamofire的集成,并提供了对Swift类型安全的网络层抽象。...在实际开发中,还可以根据需要添加错误处理、自定义请求头、请求参数等功能,以满足更复杂的需求。

    springside-jackson.rar

    在SpringSide项目中,我们通常会自定义`ObjectMapper`以优化性能、增加定制化行为,例如日期格式化、忽略未知属性、添加自定义模块等。这个类可能包含了对Jackson的配置,如注册模块、设置序列化和反序列化策略等。 ...

Global site tag (gtag.js) - Google Analytics