[英]Jackson Serialize Field to Different Name
我有這個 JSON 來反序列化:
{
"first-name": "Alpha",
"last-name": "Beta",
"gender": "m"
}
我想將其序列化為 2 種不同的格式:
[一]
{
"first-name": "Alpha",
"last-name": "Beta",
"gender": "m"
}
[乙]
{
"firstName": "Alpha",
"lastName": "Beta",
"gender": "m"
}
我可以將其序列化為 1 種格式:僅 [A] 或僅 [B]。 這是我將其序列化為 [B] 的代碼:
public String firstName;
public String lastName;
public String gender;
@JsonProperty("firstName")
public String getFirstNameCC() {
return firstName;
}
@JsonProperty("first-name")
public void setFirstNameD(String firstName) {
this.firstName = firstName;
}
@JsonProperty("lastName")
public String getLastNameCC() {
return lastName;
}
@JsonProperty("last-name")
public void setLastNameD(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
我在這里閱讀了JsonView
http://www.baeldung.com/jackson-json-view-annotation(“5 . 自定義 JSON 視圖”部分),但它只會改變它的值。 我想像上面的例子一樣更改字段名稱。 任何人都可以對此提供見解嗎?
我不確定我是否完全理解你的問題,但對於我所理解的,你可以做這樣的事情來實現不同的序列化。
創建一個自定義注釋來保存所有可能的不同序列化選項:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomJsonProperty {
String propertyName();
String format();
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
CustomJsonProperty[] value();
}
}
相應地注釋你的類:
@JsonSerialize(using = CustomJsonPropertySerializer.class)
public class Bar {
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "first-name", format = "A"),
@CustomJsonProperty(propertyName = "firstName", format = "B")
})
private String firstName;
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "last-name", format = "A"),
@CustomJsonProperty(propertyName = "lastName", format = "B")
})
private String lastName;
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "gender-x", format = "A"),
@CustomJsonProperty(propertyName = "gender", format = "B")
})
private String gender;
@JsonIgnore
private String format;
//getters & setters
}
創建一個自定義序列化程序來解釋您的新注釋:
public class CustomJsonPropertySerializer extends JsonSerializer<Bar> {
@Override
public void serialize(Bar bar, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartObject();
Field[] fields = bar.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object value = null;
try {
value = field.get(bar);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (field.isAnnotationPresent(CustomJsonProperty.List.class)) {
CustomJsonProperty[] properties = field.getAnnotation(CustomJsonProperty.List.class).value();
CustomJsonProperty chosenProperty = null;
for (CustomJsonProperty c : properties) {
if (c.format().equalsIgnoreCase(bar.getFormat())) {
chosenProperty = c;
break;
}
}
if (chosenProperty == null) {
//invalid format given, use first format then
chosenProperty = properties[0];
}
jsonGenerator.writeStringField(chosenProperty.propertyName(), value.toString());
}
}
jsonGenerator.writeEndObject();
}
}
現在,您可以考慮屬性名稱的不同格式來序列化您的對象:
public static void main(String[] args) throws IOException {
Bar bar1 = new Bar("first", "last", "m", "A");
Bar bar2 = new Bar("first", "last", "m", "B");
ObjectMapper mapper = new ObjectMapper();
String json1 = mapper.writeValueAsString(bar1);
String json2 = mapper.writeValueAsString(bar2);
System.out.println(json1);
System.out.println(json2);
}
輸出:
{"first-name":"first","last-name":"last","gender-x":"m"}
{"firstName":"first","lastName":"last","gender":"m"}
當然,上面的序列化程序只適用於 Bar 對象,但是使用abstract String getFormat();
繼承可以很容易地解決這個問題abstract String getFormat();
在超類上並更改自定義序列化程序以接受超類類型,而不是 Bar。
也許有比創建自己的東西更簡單的方法,但我不知道。 如果有什么不清楚的,請告訴我,我可以再次詳細說明。
有一個更簡單的方法來做到這一點 - 創建一個使用“addMixin”函數的對象映射器。
要序列化的類:
Class YouWantToSerializeMe {
public String firstName;
public String lastName;
public String gender;
@JsonProperty("firstName")
public String getFirstNameCC() {
return firstName;
}
@JsonProperty("lastName")
public String getLastNameCC() {
return lastName;
}
}
現在,要同時使用內置字段名稱和自定義字段名稱進行序列化,您可以執行以下操作:
Class DoTheSerializing {
String serializeNormally(YouWantToSerializeMe me) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectWriter objectWriter = objectMapper.writer();
return objectWriter(me)
}
String serializeWithMixin(YouWantToSerializeMe me) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectWriter objectWriter = objectMapper
.addMixIn(YouWantToSerializeMe.class, MyMixin.class)
.writer();
return objectWriter(me)
}
interface MyMixin {
@JsonProperty("first-name")
public String getFirstNameCC();
@JsonProperty("last-name")
public String getLastNameCC();
}
}
這在類中使用嵌入式接口來保持本地化。 您可以圍繞此進行大量優化,例如創建靜態 ObjectMapper 和加載/卸載 mixin。
使用界面作為“模板”來控制映射功能真的很強大。 您可以在字段和類級別添加內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.