[英]Extending a jackson custom serializer
給定MyClass2擴展了MyClass1並僅向MyClass1添加了兩個屬性,我為兩個類編寫了兩個Jackson自定義序列化器,如下所示:
public class MyClass1Serializer extends JsonSerializer<MyClass1> {
@Override
public void serialize(MyClass1 myClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("ApplicationName", myClass1.getApplicationName());
jsonGenerator.writeStringField("UserName", myClass1.getUserName());
}
}
和
public class MyClass2Serializer extends JsonSerializer<MyClass2> {
@Override
public void serialize(MyClass2 myClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("ApplicationName", myClass2.getApplicationName());
jsonGenerator.writeStringField("ErrorMessage", myClass2.getErrorMessage());
jsonGenerator.writeStringField("ResultCode", myClass2.getResultCode());
jsonGenerator.writeStringField("UserName", myClass2.getUserName());
}
}
哪個工作正常,並提供以下輸出:
{“ ApplicationName”:“ FakeApp”,“ UserName”:“ Joe the Schmoe”}
{“ ApplicationName”:“ AnotherApp”,“ ErrorMessage”:“呃哦!”,“ ResultCode”:“ Errrrm,不好...”,“ UserName”:“ John Doe”}
好吧,對我來說,這兩個序列化方法似乎有代碼重復,我可以從第一個序列化第二個序列化器嗎? Hmmmm ...
嗯,好吧,我嘗試了這個:
public class MyClass1Serializer<T extends MyClass1> extends JsonSerializer<MyClass1> {
@Override
public void serialize(MyClass1 myClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("ApplicationName", myClass1.getApplicationName());
jsonGenerator.writeStringField("UserName", myClass1.getUserName());
}
}
和
public class MyClass2Serializer extends MyClass1Serializer<MyClass2> {
public void serialize(MyClass2 myClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
super.serialize(myClass2, jsonGenerator, serializerProvider);
jsonGenerator.writeStringField("ErrorMessage", myClass2.getErrorMessage());
jsonGenerator.writeStringField("ResultCode", myClass2.getResultCode());
}
}
哪個可以編譯並運行,但是給我以下輸出:
{“ ApplicationName”:“ FakeApp”,“ UserName”:“ Joe the Schmoe”}
{“ ApplicationName”:“ AnotherApp”,“ UserName”:“ John Doe”}
我很清楚MyClass2Serializer現在已被完全忽略,Jackson找到了MyClass1Serializer並將其用於MyClass2。 (因為它沒有直接子類化JsonSerializer?)
允許這種簡單的情況,沒什么大不了的,但是我在工作中的實際類結構可以通過將自定義序列化器“鏈接”在一起而真正受益,而不必從頭開始。
以防萬一,我通過類的批注告訴Jackson用於哪個類的序列化器:
@JsonSerialize(using=MyClass1Serializer.class)
public class MyClass1 {
將來可能出現的問題:假設甚至可以將自定義序列化器子類化,也可以將自定義解串器子類化嗎? 指向一些示例代碼或教程的指針真棒!
有趣的事情:我試圖重現該問題,但似乎可行:
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.*;
public class Test
{
public static void main(String[] args) {
MyClass1 myc1 = new MyClass1("app1", "user1");
MyClass1 myc2 = new MyClass2("app2", "user2", "err2", "rc2");
try {
System.out.println(new ObjectMapper().writeValueAsString(myc1));
System.out.println(new ObjectMapper().writeValueAsString(myc2));
} catch (Exception e) {
e.printStackTrace();
}
}
@JsonSerialize(using = MyClass1Serializer.class)
public static class MyClass1 {
protected String applicationName;
protected String userName;
public MyClass1() {}
public MyClass1(String applicationName, String userName) {
this.applicationName = applicationName;
this.userName = userName;
}
public String getApplicationName() { return applicationName; }
public String getUserName() { return userName; }
}
@JsonSerialize(using = MyClass2Serializer.class)
public static class MyClass2 extends MyClass1 {
protected String errorMessage;
protected String resultCode;
public MyClass2() {}
public MyClass2(String applicationName, String userName, String errorMessage, String resultCode) {
super(applicationName, userName);
this.errorMessage = errorMessage;
this.resultCode = resultCode;
}
public String getErrorMessage() { return errorMessage; }
public String getResultCode() { return resultCode; }
}
public static class MyClass1Serializer<T extends MyClass1> extends JsonSerializer<T> {
@Override
public void serialize(MyClass1 myClass1, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException
{
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("ApplicationName", myClass1.getApplicationName());
jsonGenerator.writeStringField("UserName", myClass1.getUserName());
//jsonGenerator.writeEndObject();
}
}
public static class MyClass2Serializer extends MyClass1Serializer<MyClass2> {
@Override
public void serialize(MyClass2 myClass2, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException
{
super.serialize(myClass2, jsonGenerator, serializerProvider);
jsonGenerator.writeStringField("ErrorMessage", myClass2.getErrorMessage());
jsonGenerator.writeStringField("ResultCode", myClass2.getResultCode());
//jsonGenerator.writeEndObject();
}
}
}
輸出:
{"ApplicationName":"app1","UserName":"user1"}
{"ApplicationName":"app2","UserName":"user2","ErrorMessage":"err2","ResultCode":"rc2"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.