当前位置:   article > 正文

java中的枚举序列化与反序列化(fastjson)_fastjson 枚举序列化

fastjson 枚举序列化

想要达到的效果

效果图

注意使用的是fastjson

TestA这个类里面有一个字段,类型是一个枚举类EnumS,当使用JSON转String的时候,这个时候转出来的结果就是展示枚举的枚举名称
错误效果

序列化

不要枚举名称,需要获取枚举中的内容,需要加上两种注解,分别为:

@JSONType(serializeEnumAsJavaBean = true)//加到枚举类上面
  • 1
@JSONField(name = "枚举字段名")//加到枚举字段上面
  • 1

完整版如下


import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.annotation.JSONType;

/**
 * @Version 1.0
 * @Author:xh
 * @Date:2024/4/11
 * @Content:
 */
@JSONType(serializeEnumAsJavaBean = true)
public enum EnumS {
    ONE(1, "one"),
    TWO(2, "two");
    @JSONField(name = "value")
    private int value;
    @JSONField(name = "name")
    private String name;
    EnumS(int value, String name) {
        this.value = value;
        this.name = name;
    }
    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 根据 value 查找对应的枚举常量
    public static EnumS findByValue(int value) {
        for (EnumS enumS : values()) {
            if (enumS.getValue() == value) {
                return enumS;
            }
        }
        return null; // 或者抛出异常
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

在这里插入图片描述
此时的类转String已经是输出枚举内容

反序列化

根据我们序列化出的String内容,构建实体类
需要一个根据枚举中内容获取枚举的方法(可以为两个参数,也可以一个参数,找到枚举即可)

/ 根据 value 查找对应的枚举常量
    public static EnumS findByValue(int value) {
        for (EnumS enumS : values()) {
            if (enumS.getValue() == value) {
                return enumS;
            }
        }
        return null; // 或者抛出异常
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

需要构建一个类用于自定义解析枚举内容
参考:


import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;

import java.lang.reflect.Type;

/**
 * @Version 1.0
 * @Author:xh
 * @Date:2024/4/11
 * @Content:
 */
public class EnumSDeserializer  implements ObjectDeserializer {
	//返回结果修改为你自己的枚举类
    @Override
    public EnumS deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        JSONObject jsonObject = parser.parseObject();
        if (jsonObject != null) {
            int value = jsonObject.getIntValue("value");
            int 枚举字段名 = jsonObject.getIntValue("枚举字段名");
            // 使用 findByValue 方法查找枚举常量
            return EnumS.findByValue(枚举字段名);
        }
        return null;
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

实体类里面的枚举字段也需要加一个注解

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

/**
 * @Version 1.0
 * @Author:xh
 * @Date:2024/4/11
 * @Content:
 */
@Data
public class TestA {
    @JSONField(deserializeUsing = EnumSDeserializer.class)//这个类名是你的自定义解析枚举内容的类
    public EnumS enumS;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/950993
推荐阅读
相关标签
  

闽ICP备14008679号