今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是int类型,可是它自带的解析int是按照枚举的顺序来解析的,可是有时候值不必定和顺序相对应,因此使用自定义解析器方式进行解决。在网上找解决方案,没找到详细的方法。经过查看源代码得出解决方案
以解析以下枚举为例:json
public enum Status { Ready(10), Completed(20); private int value; private Status(int value) { this.value = value; } public static Status create(int value) { switch (value) { case 10: return Status.Ready; case 20: return Status.Completed; default: throw new RuntimeException("code error"); } } public static int value(Status status){ return status.value; } }
反序列化过程实现objectDeserializer接口,以上枚举代码以下:this
public class StatusDeserializer implements ObjectDeserializer { public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { JSONLexer lexer = parser.getLexer(); int value = lexer.intValue(); return (T) Status.create(value); } public int getFastMatchToken() { // TODO Auto-generated method stub return 0; } }
序列化过程实现ObjectSerializer接口spa
public class StatusSerializer implements ObjectSerializer{ public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType) throws IOException { SerializeWriter out = serializer.getWriter(); if (object == null) { serializer.getWriter().writeNull(); return; } out.write(Status.value((Status)object)); } }
使用自定义的序列化和反序列化的方法以下:
序列化过程code
SerializeConfig config=new SerializeConfig(); config.put(Status.class, new StatusSerializer()); String jsonStr=JSON.toJSONString(test,config);
反序列化过程接口
ParserConfig.getGlobalInstance().putDeserializer(Status.class, new StatusDeserializer());
Test test1=JSON.parseObject(jsonStr,Test.class);
除了处理枚举类型时,有时须要自定义序列化、反序列化方法外,在处理日期、时间等类型时也常常须要本身实现。字符串