我正在使用Jackson 2.22序列化一些现有对象,利用MixIn功能将实际对象与Jackson批注配置分离。
实际上,我的mixin是一个接口,该接口声明目标类的相同方法并对其进行注释,这是一个示例。
目标类别:
public class Product {
// ...
public String getName();
public String getDescription();
public String getPrice();
public String getFinalPrice();
public String getDiscount();
// ...
}
和mixin:
public interface ProductApi {
@JsonProperty
public String getName();
@JsonProperty("price")
public String getFinalPrice();
}
我的JSON应该具有更多信息,这些信息是根据目标类的几种方法或字段计算得出的。
杰克逊有可能吗?
我尝试在类中打开mixin并在其中添加新方法,但这没有用。
public class ProductApi {
@JsonProperty
public String getName();
@JsonProperty("price")
public String getFinalPrice();
@JsonProperty("images")
public List<String> getImages() { /* ... */ }
}
我猜这是因为mixin仅提供目标类的注释,而后者是为序列化而读取的。
当然,如果我使用包含我需要的新方法的新子类更改要序列化的对象,那可以工作,但是对象来自我们的服务层,这意味着我必须重写所有这些方法。
我正在将Jackson与Jersey一起使用,所以不想将Jackson与其他库一起更改。
这是我的方法。
解决方案是为字段getter 指定一个定制的JsonSerializer实现。
首先,我改变了混入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
将其实现为静态类,但只是为了简单起见。
最后,序列化器需要绑定到带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()
未使用该方法的返回值。
问题内容: 我正在使用Jackson 2.22序列化一些现有对象,利用MixIn功能将实际对象与Jackson批注配置分离。 实际上,我的mixin是一个接口,该接口声明目标类的相同方法并对其进行注释,这是一个示例。 目标类别: 和mixin: 我的JSON应该具有更多信息,这些信息是根据目标类的几种方法或字段计算得出的。 杰克逊有可能吗? 我尝试在类中打开mixin并在其中添加新方法,但这没有用
问题内容: 如何添加到特定内容?不起作用。 问题答案: jQuery <1.9 jQuery 1.9以上
问题内容: 我在MVC 4程序中使用Json.net。 我有一个阶级的对象。 我做了: 现在,我想添加一个额外的属性,如成。 我如何使用Json.net实现这一目标? 问题答案: 您有几种选择。 正如@Manvik所建议的那样,最简单的方法就是在类中添加另一个属性并在序列化之前设置其值。 如果您不想这样做,那么下一个最简单的方法是将您的对象加载到中,追加新属性值,然后从那里写出JSON。这是一个简
我想在我的< code >上添加属性 似乎路线路径确实与问号混淆了。如果我把它换成其他东西,比如一个符号戳,它就会“起作用”。然而,这不是我想要的格式。我想要常规的<代码> 我找不到关于如何使这样的东西工作的文档。我看到了一些关于url的部分的东西,但我不太理解它。 谢谢你的所有帮助
问题内容: 我试图通过rest API将数据添加到数据库中,但是在添加数据时遇到一些问题。因此,基本上我已经从管理页面添加了此数据,但是我想通过使用请求从其他python添加此数据。当我发送发布请求时,它表明已添加该请求,但传感器数组为空 models.py serializers.py adddata.py payload2看起来像 问题答案: 我已经尝试过使用单站和多个传感器,但是我想您将能够
我试图反序列化2种不同类型的列表,包括它们的派生类 为了更好地解释它,我做了下面的例子 我有2个系统: API系统 与下列实体合作: 应用系统 使用以下DTO 使用此示例,API系统返回一个