java - 如何在不同的地方对同一个 Java 枚举使用不同的 Jackson JsonSerializers?

标签 java json enums jackson jsonserializer

在 JEE 应用程序中,我使用 GUI 的一些自定义标签字符串创建了一个枚举:

public enum MyThing 
{
    THING1("Label 1"),
    ...
    THING5("Label 5");

    private String label;

    private MyThing(String label)
    {
        this.label = label;
    }
    ...
}

具有此枚举类型属性的对象通过 REST API 进行交付。属性值被序列化为字符串 ID,这就是我所需要的:

具有枚举属性的类:

public class MyBO
{
    private MyThing thing;
    ...
}

服务等级:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
...

@Path("/bos")
public class MyBOsService
{
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public BO getBO()
    {
        BO bo = new BO();
        ...
        return bo;
    }
}

REST 调用结果:

{"thing":"THING1",...}

太棒了!不过,现在我还想通过不同的 REST 服务类提供完整的 ID 和标签列表:

@Path("/masterdata")
public class MasterDataService
{
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public MyThing[] allMyThings()
    {
        return MyThing.values();
    }
}

所需的 REST 调用结果:

[{"THING1":"Label 1"},{"THING2":"Label 2"}, ...]

我创建了一个自定义 Jackson JsonSerializer 将枚举值序列化为 id-label 对:

import org.codehaus.jackson.map.JsonSerializer;
...

public class MyThingSerializer extends JsonSerializer<MyThing>
{
    @Override
    public void serialize(MyThing myThing, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException
    {
    ...
    }
}

但是现在,我找不到一个合理的位置来通过 @JsonSerialize 注释附加此 JsonSerializer。如果我将它附加到枚举,例如

@JsonSerialize(using = MyThingSerializer.class)
public enum MyThing{...

所有枚举值都被序列化为 id-label 对,这对于除一个之外的所有 REST 调用都是错误的。

如果我将它附加到应该提供 id-value 对列表的方法,则什么也不会发生:

@Path("/masterdata")
public class MasterDataService
{
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @JsonSerialize(using = MyThingSerializer.class)
    public MyThing[] allMyThings()
    {
        return MyThing.values();
    }
}

REST 调用结果:

["THING1","THING2",...]

我知道我可以将“id-label序列化器”附加到枚举本身,然后附加另一个序列化器,该序列化器再次将默认序列化恢复到枚举的所有其他出现,但是有没有更智能的方法来实现所需的不同在不同地点连载?

最佳答案

您可以使用 @JsonSerialize(using=MySerializer.class) 指定每个属性的自定义序列化程序

如果是列表和数组,您将需要使用:

@JsonSerialize(contentsUsing=MySerializer.class)

因为 using 将取代用于 List 或数组本身的序列化器;对于值,使用不同的序列化器。

关于java - 如何在不同的地方对同一个 Java 枚举使用不同的 Jackson JsonSerializers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833633/

相关文章:

java - 在这种情况下,ForkJoinPool 可以比 ExecutorService 更快吗?

java - 将递归转换为迭代

json - 如何获得 Flow 类型检查器覆盖的 JSON.parse 结果?

c# - 在抽象字典中使用枚举 Bastetype 作为键

java - 为什么所有 opengl 枚举都是十六进制的?

c# - 在 System.Data.SqlDbType 和 Microsoft.SqlServer.Management.Smo.SqlDataType 之间转换

java - 缓冲输出流

java - 根据条件选择重载函数

javascript - 当 JSON 对象为空时显示适当的消息

c# - JSON不能反序列化为对象,需要数组?