登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. 未分类
  3. 正文

alibaba.fastjson自定义枚举Enum序列化

2019-04-08

一、过程

  1. 创建枚举型接口
import com.alibaba.fastjson.annotation.JSONType;

/**
 * 自定义JSON序列化枚举的接口
 */
@JSONType(serializer = EnumBaseSerializer.class)
public interface EnumBase{
    Integer getId();
    String getName();
}

2. 自定义枚举序列化类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义枚举JSON序列化类
 */
public class EnumBaseSerializer implements ObjectSerializer {
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;
        if (object instanceof EnumBase) {
            Map map = new HashMap<Integer,String>();
            EnumBase enuma = (EnumBase) object;
            map.put("id",enuma.getId());
            map.put("name",enuma.getName());
            out.writeString(JSON.toJSONString(map));
        } else {
            out.writeEnum((Enum<?>) object);
        }
    }
}

3. 建立测试枚举

import com.alibaba.fastjson.annotation.JSONType;

// 自定义序列化类
@JSONType(serializeEnumAsJavaBean = true,serializer = EnumBaseSerializer.class)
public enum Gender implements EnumBase{

    MALE(1,"男"),
    FEMALE(2,"女");

    private Integer id;
    private String name;
    Gender(Integer id,String name){
        this.id = id;
        this.name = name;
    }
    public Integer getId(){
        return this.id;
    }
    public String getName(){
        return this.name;
    }

    /**
     * 根据ID,返回Name
     * @param id
     * @return
     * @throws Exception
     */
    public static String getNameById(Integer id)throws Exception{
        return Gender.getById(id).getName();
    }
    /**
     * 根据ID,返回实例
     * @param id
     * @return
     * @throws Exception
     */
    public static Gender getById(Integer id)throws Exception{
        //return Gender.values();
        for(Gender singleEnum:Gender.values()){
            if(singleEnum.getId()==id){
                return singleEnum;
            }
        }
        throw new Exception(Gender.class.getName()+" 未知枚举项: " + id);
    }
}

4.自定义测试类2

import lombok.Data;

@Data
public class TestToJson {
    private String name = "测试";
    private Gender gender = Gender.FEMALE;
    private Gender[] genders = Gender.values();
}

5.Main测试类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializeConfig;

import java.util.ArrayList;
import java.util.List;

public class App {
    public static void main(String args[]){
        try{
            System.out.println("Hello World!");
            System.out.println("id 1= " + Gender.getNameById(1));
            System.out.println("id 2= " + Gender.getNameById(2));

            Gender g = Gender.MALE;

            System.out.println("JSON ENUM: " + JSON.toJSONString(Gender.values()));
            System.out.println("JSON CLASS: " + JSON.toJSONString(new TestToJson()));
        }catch (Exception ex){
            System.out.println(ex.getMessage());
        }

    }
}

-

测试可以通过。

标签: 暂无
最后更新:2019-04-08

代号山岳

知之为知之 不知为不知

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号