gpt4 book ai didi

java - 如何将派生属性添加到 Jackson 2 序列化类?

转载 作者:行者123 更新时间:2023-12-01 06:11:39 25 4
gpt4 key购买 nike

我正在使用 Jackson 2.22 序列化一些现有对象,利用 MixIn 功能将真实对象与 Jackson 注释配置解耦。

实际上我的mixin是一个接口(interface),它声明了目标类的相同方法并对其进行了注释,这是一个示例。

目标类别:

public class Product {

// ...

public String getName();

public String getDescription();

public String getPrice();

public String getFinalPrice();

public String getDiscount();

// ...

}

和混合:

public interface ProductApi {

@JsonProperty
public String getName();

@JsonProperty("price")
public String getFinalPrice();

}

我的 JSON 应该包含更多信息,这些信息是根据目标类的多个方法或字段计算得出的。

这在 jackson 可能吗?

我尝试在类中转动 mixin 并在其中添加新方法,但这不起作用。

public class ProductApi {

@JsonProperty
public String getName();

@JsonProperty("price")
public String getFinalPrice();

@JsonProperty("images")
public List<String> getImages() { /* ... */ }

}

我猜这是因为 mixin 只为目标类提供注释,但后者是为了序列化而读取的。

当然,如果我更改要使用包含我需要的新方法的新子类序列化的对象,这是可行的,但对象来 self 们的服务层,这意味着我必须重写所有这些方法。

我正在将 Jackson 与 Jersey 一起使用,因此不想用其他库更改 Jackson。

最佳答案

我是这样做的。

解决方案是指定自定义JsonSerializer字段 getter 的实现。

首先,我将 mixin interface 更改为扩展实体(目标)类的 class,以便它可以访问目标类数据。

public class ProductApi extends Product {

@JsonProperty
@Override
public String getName() {
return super.getName();
};

// ...

}

接下来,我实现了 JsonSerializer 来创建我想要的派生属性:

public static class ImagesSerializer extends JsonSerializer<String> {

@Override
public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
Product p = (Product) jgen.getCurrentValue();

int num = p.getNumberOfImages();

List<String> imgs = new ArrayList<String>(num);

for(int i = 0; i < num; i++) {
String src = "/include/images/showImage.jsp?"+"id="+p.getId()+"&number="+i;
imgs.add(src);
}

provider.defaultSerializeValue(imgs, jgen);
}

}

这是一个非常简单的实现,应该进行更多的安全检查。

基本上,它的作用是从 JSON 生成器检索整个实体实例,构建自定义对象,然后要求 Jackson 对其进行序列化。
我在我的 ProductApi 中将其作为静态类实现,但只是为了简单起见。

最后,序列化器需要绑定(bind)到 JsonProperty 带注释的字段:

public class ProductApi extends Product {

@JsonProperty
@Override
public String getName() {
return super.getName();
};

// ...

@JsonSerialize(using=ImagesSerializer.class)
@JsonProperty("images")
@Override
public String getImage() { // in my entity this returns an image number, whereas in my JSON I want a list of URLs
return "";
}

// ...

}

顺便说一句,似乎没有使用 getImage() 方法的返回值。

关于java - 如何将派生属性添加到 Jackson 2 序列化类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33408640/

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