`

自定义Jackson Json的Serializer

阅读更多
转载请标明出处: http://fuliang.iteye.com/blogs/1141293

内容系统需要做分类、抽取等的评测工具,这个工具每次评测的对象需要的字段不一样,可以是一项或多项内容结合的评估。我们希望能够动态定义这些评测的字段,并且这些字段供给ExtJS的表格展现。
ExtJS所consume的JS格式非常固定,所以需要转化成这种固定的格式才能正确展现。所以我们对评估对象targets定义了几个固定的字段id,url,version和动态定义的评测字段evaljson的json字符串。

引用

id |          url          |                                evaljson                                 | version
----+-----------------------+-------------------------------------------------------------------------+---------
  1 | http://www.tuniu.com/ | {"md5":"856f509af96b3c68dccca042d6a21729","xianlu_confidence":0.732410} |       0
  2 | http://www.tuniu.com/ | {"md5":"856f509af96b3c68dccca042d6a21729","xianlu_confidence":0.932410} |       1



这样我们写了模型:
package com.qunar.search.evaltool.model;


public class EvalTarget {
	private Long id;
	private String url;
	private Long version;
	private String evalJson;

        //getter setter equals hashcode ....
}


这个直接和数据库的字段对应,方便使用mybatis从数据库取出,分页省略:
package com.qunar.search.evaltool.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import com.qunar.search.evaltool.model.EvalTarget;

@Repository
public interface EvalTargetDAO {
	@Select("select * from eval_targets")
	List<EvalTarget> getEvalTargets();
       //other code...
}


而目标ExtJS要consume的格式:
引用

{
  evalTargets: [
    {id: 1, "version": 0, "url": "http://www.tuniu.com/","md5": "856f509af96b3c68dccca042d6a21729", "xianlu_confidence" : 0.732410},
    {id: 2, "version": 1, "url": "http://www.tuniu.com/","md5": "856f509af96b3c68dccca042d6a21729", "xianlu_confidence" : 0.932410}
  ],
  totalCount: 2
}

这时候离ExtJS要consume的格式相差甚远。
我们定义VO来将数据展现,我们把EvalTarget的所有字段封装成一个evalFields,希望能接近我们目标ExtJS要consume的格式。
package com.qunar.search.evaltool.vo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.json.JSONException;
import org.json.JSONObject;

import com.qunar.search.evaltool.model.EvalTarget;

public class EvalTargetVO {
	private Map<String,String> evalFields;
	
	public EvalTargetVO(EvalTarget evalTarget){
		String evalJson = evalTarget.getEvalJson();
		try {
			evalFields = new HashMap<String,String>();

			evalFields.put("id", evalTarget.getId().toString());
			evalFields.put("url", evalTarget.getUrl());
			evalFields.put("version", evalTarget.getVersion().toString());
			
                        JSONObject jsonObject = new JSONObject(evalJson);
			@SuppressWarnings("rawtypes")
			Iterator it = jsonObject.keys();
			
			while(it.hasNext()){
				String key = it.next().toString();
				String value = jsonObject.get(key).toString();
				evalFields.put(key, value);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	public Map<String,String> getEvalFields() {
		return evalFields;
	}
}


在控制器中:
        @RequestMapping(value="/list")
	public @ResponseBody Map<String,Object> list(){
		Map<String,Object> map = new HashMap<String,Object>();
		List<EvalTargetVO> evalTargets = wrap2Vo(evalTargetService.getEvalTarget());
		map.put("evalTargets", evalTargets);
		return map;
	}

这时候生成的JSON格式是这样的:
引用

{
evalTargets: [
  {
    evalFields: {id: 1, "version": 0, "url": "http://www.tuniu.com/","md5": "856f509af96b3c68dccca042d6a21729", "xianlu_confidence" : 0.732410 }
  },
  {
     evalFields: {id: 2, "version": 1, "url": "http://www.tuniu.com/","md5": "856f509af96b3c68dccca042d6a21729", "xianlu_confidence" : 0.932410}
  }   
],
  totalCount: 2
}

还是和目标有很大的差距,这时候就得用自定义Jackson的Serializer来解决这个格式问题了:
package com.qunar.search.evaltool.vo;

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;

public class EvalTargetVOSerializer extends JsonSerializer<EvalTargetVO>{

	@Override
	public void serialize(EvalTargetVO value, JsonGenerator jgen,
			SerializerProvider provider) throws IOException,
			JsonProcessingException {
		ObjectMapper mapper = new ObjectMapper();
		mapper.writeValue(jgen, value.getEvalFields());
	}

}

我们简单将EvalTargetVO的evalFields的hashmap使用ObjectMapper写入JsonGenerator即可转换成目标格式。
我们在使用注解来指定Json序列化为我们自定义个序列化类:
@JsonSerialize(using=EvalTargetVOSerializer.class)
public class EvalTargetVO 


这样就解决了对于动态扩展字段提供ExtJs需要的Json格式的数据了。

Jackson Json的一些API以及例子:
http://wiki.fasterxml.com/JacksonInFiveMinutes
1
4
分享到:
评论

相关推荐

    jackson-serializer-fun

    "Jackson-Serializer-Fun"项目显然旨在展示Jackson库在自定义序列化方面的灵活性和深度。让我们深入探讨Jackson库的一些关键特性,以及如何自定义对象序列化以满足特定需求。 1. **Jackson序列化基础**: Jackson...

    jackson解析json字符串,首字母大写会自动转为小写的方法

    Jackson能够将Java对象与JSON字符串相互转换,但在使用过程中,开发者可能会遇到字段首字母大小写转换的问题,即当Java类中的字段首字母为大写时,序列化成JSON字符串后首字母会自动转换为小写。本文将探讨Jackson在...

    springboot-jackson-auto-transform-enum.zip

    Jackson自定义序列化和反序列化是提高灵活性和控制JSON转换过程的关键功能。当涉及到枚举类型(enum)时,这种定制尤其重要,因为默认的序列化方式可能不满足所有业务需求。 1. **Jackson库**:Jackson是Java领域最...

    json-lib(jar)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...不过,随着技术的发展,现代的Java项目更倾向于使用Gson、Jackson或 FasterXML 等更现代的库来进行JSON操作,因为它们提供了更好的性能和更多的特性。

    转json对象jar包

    为此,开发者可以创建自定义的序列化模块(Serializer)或反序列化模块(Deserializer),并注册到JSON库中,以实现个性化的日期格式转换。 在标签"json"下,我们可以推测这个jar包是专门处理JSON相关操作的,包括...

    java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化

    Jackson允许你通过注解(`@JsonFormat`)或者自定义`Serializer`和`Deserializer`来控制日期的序列化和反序列化。例如,你可以使用`@JsonFormat`注解来定义日期格式: ```java import ...

    后台日期类型转json字符串传到页面

    3. **自定义Serializer**:如果我们使用的是`net.sf.json`库,可以创建一个自定义的`JsonSerializer`,重写`processValue()`方法,将日期转换为我们期望的格式。 4. **JSON库配置**:有些JSON库如`org.json`或`json...

    json的讲解

    在处理JSON中的日期类型时,由于JSON标准不直接支持日期,通常需要自定义转换器。例如,在Java中,你可以创建一个实现了`com.alibaba.fastjson.serializer.JSONValueProcessor`接口的类,实现`process()`方法来按照...

    JSON类库 Flexjson

    String jsonString = serializer.serialize(person); ``` - **反序列化**: 反之,如果你有一个JSON字符串,并想将其转换回Java对象,可以使用`JSONDeserializer`: ```java String jsonString = "{\"firstName\...

    jsonex:Java对象序列化器和反序列化器为JSON格式。 专注于配置友好性,任意对象序列化和紧凑的JSON格式

    Jsonex JSONCoder是一个轻量级的通用对象序列化/反序列化库,类似于Jackson,GSON或FastJson。 多年来,该库已在各种eBay项目中广泛使用。 它不能替代其他流行的库。 但是,它解决了一些其他替代产品无法提供或无法...

    simplerialize:在Jackson和Woodstox之上的薄包装器,提供了用于序列化为XML和JSON的统一API,同时牺牲了灵活性和自定义性

    关于 这是一个自以为是的带有狭窄... Serializer serializer = (json) ? new JacksonJsonSerializer(...) : new WoodstoxXmlSerializer(...) serializer.start(); serializer.startContainer("root"); { serializer

    fastJson.rar

    3. 自定义类型处理器:通过实现`com.alibaba.fastjson.serializer.SerializerFeature`和`com.alibaba.fastjson.parser.deserializer.DeserializerFeature`接口,可以定制JSON序列化和反序列化的行为。 4. JSON到XML...

    flexJson.jar包,和列子

    然而,对于大规模的JSON处理,可能需要考虑更优化的库,如Jackson或Gson。 6. **示例代码**: - 从提供的描述"flexJson,实例,json转对象,json转List"来看,你可能已经包含了使用FlexJson进行JSON到对象和JSON到...

    fastjson-1.2.2.jar

    1. 高速解析:Fastjson采用了优化的算法,使得在处理大规模JSON数据时,其解析速度远超同类产品,如Jackson和Gson等。 2. 简单API:Fastjson提供了简洁的API,使得JSON与Java对象之间的转换变得异常简单,如`JSON....

    fastjson使用

    Fastjson相比其他JSON库如Jackson、Gson等,具有更快的性能和更少的内存消耗,尤其是在处理大数据量时优势明显。同时,Fastjson的API设计简洁,易于理解和使用。 总结,Fastjson作为Java世界中的一员猛将,凭借其...

    fastJson开发包、源码及相关api文档

    与其它JSON库如Jackson、Gson等相比,FastJson在某些场景下表现出了更高的性能优势,尤其在大数据量处理时,它的解析速度更为突出。 ### 一、FastJson的基本概念 1. **JSON(JavaScript Object Notation)**:一种...

    SpringBoot2.3整合redis缓存自定义序列化的实现

    Jackson2JsonRedisSerializer&lt;Object&gt; serializer = new Jackson2JsonRedisSerializer(Object.class); template.setDefaultSerializer(serializer); return template; } } ``` 在上面的代码中,我们使用Jackson...

    redis使用过程中由于序列化工具引起的问题

    `StringRedisSerializer`仅用于字符串,`JdkSerializationRedisSerializer`使用Java内置的序列化,而`Jackson2JsonRedisSerializer`则基于流行的Jackson库将对象转换为JSON。 序列化问题通常出现在以下几个方面: ...

    浅谈fastjson的常用使用方法

    1. 快速:Fastjson在速度上相比其他基于Java的JSON库,比如jackson,要快很多。 2. 强大:它能够支持任意的JavaBean以及包括集合、Map、日期和枚举等类的序列化和反序列化。 3. 零依赖:除了JDK,它不依赖其他任何...

    spring-boot-redis.zip

    例如,使用Jackson2JsonRedisSerializer处理JSON对象: ```java @Bean public RedisTemplate, Object&gt; redisTemplate(RedisConnectionFactory factory) { RedisTemplate, Object&gt; template = new RedisTemplate();...

Global site tag (gtag.js) - Google Analytics