`

自定义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
分享到:
评论

相关推荐

    【Json serializer-Deserialize-C#】基础点罗列

    litjson包

    .net Newtonsoft.Json 4.0 release

    -Flexible JSON serializer to convert .NET objects to JSON and back again -LINQ to JSON for manually reading and writing JSON -High performance, faster than .NET's built-in JSON serializers -Writes ...

    Json.NET 6.0 R3 For.NET(2.0-4.5)

    Flexible JSON serializer for converting between .NET objects and JSON LINQ to JSON for manually reading and writing JSON High performance, faster than .NET's built-in JSON serializers Write indented, ...

    Json NET 6 0 R8 For NET 2 0 4 5

    Flexible JSON serializer for converting between .NET objects and JSON LINQ to JSON for manually reading and writing JSON High performance, faster than .NET&quot;s built-in JSON serializers Write ...

    Laravel开发-json-serializer-laravel

    Laravel开发-json-serializer-laravel PHP/Laravel的JSON序列化程序

    python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式.zip

    python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式 python Avro JSON序列化程序 AvroJsonSerializer 使用AVRO模式将数据序列化为JSON格式。为什么我们需要序列化程序而不只是转到 JSON?验证数据与...

    newtonsoft.json 6.0(20141020)

    -Flexible JSON serializer for converting between .NET objects and JSON -LINQ to JSON for manually reading and writing JSON -High performance, faster than .NET's built-in JSON serializers -Write ...

    Laravel开发-json-serializer-laravel .zip.zip

    Laravel开发-json-serializer-laravel .zip.zip

    Json50r5.zip

    -Flexible JSON serializer for converting between .NET objects and JSON -LINQ to JSON for manually reading and writing JSON -High performance, faster than .NET's built-in JSON serializers -Write ...

    json-api-serializer:Node.jsbrowser框架不可知JSON API(http

    json-api-serializer 一个Node.js / browser框架不可知库,用于将数据序列化为符合响应(用于在JSON中构建API的规范)。安装npm install --save json-api-serializer文献资料登记var JSONAPISerializer = require ( ...

    fastJSON_v2.3.5_JSON_windows_V2_

    the Polymorphic JSON Serializer .

    collection_json_serializer:使用 Collection+JSON 响应的 Ruby gem

    || :warning: 直到版本 1.X 可能会发生重大更改 | CollectionJson::Serializer 将 Ruby 对象序列化为 Collection+JSON,这是 Mike Amudsen 的超媒体类型。 请注意 CollectionJson::Serializer只序列化 data 。 您...

    jackson-serializer-fun

    杰克逊序列化器的乐趣有关如何以非常自定义的方式序列化特定类型的属性的POC。 灵感来自文档概念

    diy-json-serializer-lab-v-000

    DIY JSON序列化器实验室 目标 编写JSON序列化器 使用该JSON序列化器呈现信息而无需重新加载页面 介绍 我们将使用我们的产品/订单系统并对其进行增强,以便客户无需刷新页面即可浏览产品目录。 您将在提供的上一个...

    jsonapi-serializer:遵循JSON API规范PHP序列化程序

    jsonapi-serializer 遵循JSON API规范PHP序列化程序。 实体和字段元数据: 定义如何序列化整个实体及其字段定义如何格式化数据指示如何将数据转换为JSON API规范格式处理的数据格式: 关联数组具有公共属性的对象带...

    Json50r8

    -Flexible JSON serializer for converting between .NET objects and JSON -LINQ to JSON for manually reading and writing JSON -High performance, faster than .NET's built-in JSON serializers -Write ...

    Json.net.rar

    -Flexible JSON serializer to convert .NET objects to JSON and back again -LINQ to JSON for reading and writing JSON -Writes indented, easy to read JSON -Convert JSON to and from XML -Supports ...

    ember-json-serializer-meta:对Ember Data JSONSerializer的广泛元数据支持

    因此,我听说您使用的不是JSONAPI或REST,而是介于两者之间的混合API的自定义API。 然后,该插件适合您! 它可以为所有Ember Data normalize * Response挂钩提取元数据。 ember install ember-json-serializer-...

    serializer-2.7.2-API文档-中文版.zip

    赠送jar包:serializer-2.7.2.jar; 赠送原API文档:serializer-2.7.2-javadoc.jar; 赠送源代码:serializer-2.7.2-sources.jar; 赠送Maven依赖信息文件:serializer-2.7.2.pom; 包含翻译后的API文档:serializer...

    droidparts-test-1.3.8.zip

    vraptor-jackson-serializer.zip,使用jackson库进行json序列化的vraptor插件使用jackson库进行json序列化的vraptor插件(http://jackson.codehaus.org/)

Global site tag (gtag.js) - Google Analytics