FastJson 自定义Serialize、Parser

前端之家收集整理的这篇文章主要介绍了FastJson 自定义Serialize、Parser前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


FastJson 自定义Serialize、Parser

今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是int类型,但是它自带的解析int是按照枚举的顺序来解析的,但是有时候值不一定和顺序相对应,所以使用自定义解析器方式进行解决。在网上找解决方案,没找到详细的方法。通过查看源代码得出解决方
以解析如下枚举为例:

  1. public enum Status {
  2.  
  3. Ready(10),Completed(20);
  4.  
  5. private int value;
  6.  
  7. private Status(int value) {
  8. this.value = value;
  9. }
  10.  
  11. static Status create(switch (value) {
  12. case 10:
  13. return Status.Ready;
  14. 20:
  15. return Status.Completed;
  16. default:
  17. throw new RuntimeException("code error");
  18. }
  19. }
  20.  
  21. static int value(Status status){
  22. return status.value;
  23. }
  24. }

反序列化过程实现objectDeserializer接口,以上枚举代码如下:

  1. public class StatusDeserializer implements ObjectDeserializer {
  2.  
  3. public <T> T deserialze(DefaultJSONParser parser,Type type,Object fieldName) {
  4. JSONLexer lexer = parser.getLexer();
  5. int value = lexer.intValue();
  6. return (T) Status.create(value);
  7. }
  8.  
  9. getFastMatchToken() {
  10. // TODO Auto-generated method stub
  11. return 0;
  12. }
  13. }

序列化过程实现ObjectSerializer接口

  1. class StatusSerializer ObjectSerializer{
  2.  
  3. void write(JSONSerializer serializer,Object object,Object fieldName,Type fieldType) throws IOException {
  4. SerializeWriter out = serializer.getWriter();
  5. if (object == null) {
  6. serializer.getWriter().writeNull();
  7. return;
  8. }
  9. out.write(Status.value((Status)object));
  10. }
  11. }

使用自定义的序列化和反序列化的方法如下:
序列化过程

  1. SerializeConfig config=new SerializeConfig();
  2. config.put(Status.class,new StatusSerializer());
  3. String jsonStr=JSON.toJSONString(test,config);

反序列化过程

  1. ParserConfig.getGlobalInstance().putDeserializer(Status.class,114)">new StatusDeserializer());
  2. Test test1=JSON.parSEObject(jsonStr,Test.class);

除了处理枚举类型时,有时需要自定义序列化、反序列化方法外,在处理日期、时间等类型时也经常需要自己实现。

猜你在找的Json相关文章