加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FastJson 自定义Serialize、Parser

发布时间:2020-12-16 19:15:18 所属栏目:百科 来源:网络整理
导读:FastJson 自定义Serialize、Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是int类型,但是它自带的解析int是按照枚举的顺序来解析的,但是有时候值不一定和顺序相对应


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

    static Status create(switch (value) {
        case 10:
            return Status.Ready;
        20:
            return Status.Completed;
        default:
            throw new RuntimeException("code error");
        }
    }

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

    getFastMatchToken() {
        // TODO Auto-generated method stub
        return 0;
    }
}

序列化过程实现ObjectSerializer接口

class StatusSerializer ObjectSerializer{

    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,114)">new StatusDeserializer());
        Test test1=JSON.parSEObject(jsonStr,Test.class);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读