zoukankan      html  css  js  c++  java
  • FastJson 自定义Serialize、Parser


    FastJson 自定义Serialize、Parser

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

    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接口,以上枚举代码如下:

    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接口

    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));
        }
    }
    

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

            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);
    

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


  • 相关阅读:
    tp5后台开发某些心得
    some note
    py数据抓取小案例(博客
    vue axios的使用
    C# WebApi POST 提交
    WebApi 返回Json
    C# WebApi 处理Area路径问题
    时间比较
    将多行数据合并为一列
    汉字转换拼音
  • 原文地址:https://www.cnblogs.com/JerryWang1991/p/3936408.html
Copyright © 2011-2022 走看看