今天在處理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);
除了處理枚舉類型時,有時須要自定義序列化、反序列化方法外,在處理日期、時間等類型時也常常須要本身實現。字符串