gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:37:21 36 4
gpt4 key购买 nike

在 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com