fastjson 序列化枚举问题

项目中前后端分离,采用json数据交互。fastjson 默认对枚举的处理达不到项目需求

例如代码中有个城市的枚举


SHANGHAI(
			"上海","SHANGHAI","上海",true,"SH","shanghai.qfang.com",DataSourceEnum.SHANGHAI,"121.480263","31.236295")

默认序列化的时候是SHANGHAI 而有时候想要得到枚举的其他属性比如上海这种中文

想到的方法是利用fastjson的SerializeConfig处理 利用反射机制得到相应属性

写了一般测试没问题,发现一个问题有时候枚举序列化不成功,项目经理帮忙解决了这个问题

少了一段代码

config.put(Person.class,new JavaBeanSerializer(Person.class));

贴上代码


package com.xyw.test;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

import com.alibaba.fastjson.serializer.EnumSerializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;

/**
 * 使用方法
 * config.put(PoJo.class,new JavaBeanSerializer(PoJo.class));
 * 参数一是你的枚举类型,参数二是待输出的值(数组)
 * config.put(YourEnum.class,new EnumCnSerializer(YourEnum.class,"desc"));
 * @param <T>
 */           
@SuppressWarnings("rawtypes")
public class EnumCnSerializer<T extends Enum> extends EnumSerializer{

	private Class<T> clazz;
	private String[] proptertiesName;
	public EnumCnSerializer(Class<T> clazz,String ... proptertiesName) {
		super();
		this.clazz = clazz;
		this.proptertiesName = proptertiesName;
	}

	@Override
	public void write(JSONSerializer serializer,Object object,Object fieldName,Type fieldType) throws IOException {
		SerializeWriter out = serializer.getWriter();
        if (object == null) {
            serializer.getWriter().writeNull();
            return;
        }
		T e = clazz.cast(object) ;
        serializer.write(e.name());
        if(proptertiesName==null){
        	return;
        }
        for(String propertyName:proptertiesName){
        	propertyName = propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
        	try {
	        	Method method = clazz.getMethod("get" + propertyName);
	        	if(fieldName instanceof Integer){
		        	out.write(",");
		        	serializer.write(method.invoke(e));
		        }else{
			        out.write(",");
			        serializer.write(fieldName + propertyName);
			        out.write(":");
			        serializer.write(method.invoke(e));
		        }
        	} catch (Exception e1) {
    			return;
    		} 
        }
	}
}



package com.xyw.test;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JavaBeanSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.xyw.entity.Person;

public class Test3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Person p = new Person("ZS",CityEnum.SHANGHAI);
		String result = JSON.toJSONString(p);
		System.out.println(result);
		System.out.println("----------------");
		SerializeConfig config = new SerializeConfig();
		config.put(Person.class,new JavaBeanSerializer(Person.class));
		config.put(CityEnum.class,new EnumCnSerializer(CityEnum.class,"cityName","domain"));
		result = JSON.toJSONString(p,config);
		System.out.println(result);
		List list = new ArrayList();
		list.add(p);
		
		result = JSON.toJSONString(list,config);
		System.out.println(result);
	}

}


输出结果


{"city":"SHANGHAI","name":"ZS"}
----------------
{"city":"SHANGHAI","cityCityName":"上海","cityDomain":"shanghai.qfang.com","name":"ZS"}
[{"city":"SHANGHAI","name":"ZS"}]

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...