使用傑克遜(JSON的/對象映射器),比方說,我有以下的接口和類:@class得到補充,即使它的defaultImpl
@JsonTypeInfo(defaultImpl = Duck.class, use = JsonTypeInfo.Id.CLASS)
public interface Animal {
}
public class Duck implements Animal {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
public class Park {
private Animal animal;
public Animal getAnimal() { return animal; }
public void setAnimal(Animal animal) { this.animal = animal; }
}
我嘗試讀取(反序列化)這片JSON:
{
"animal": {
"name": "Quacky"
}
}
使用:
Park park = objectMapper.readValue(json, Park.class);
它的工作原理!即使沒有任何類型信息(@class或@type),它也能夠構建Duck
,因爲我爲Animal
接口指定了defaultImpl
。
現在我期待着相反的行爲。
String json = objectMapper.writeValueAsString(park);
而是我得到這個JSON:
{
"animal": {
"@class": "com.example.Duck"
"name": "Quacky"
}
}
它似乎並不尊重defaultImpl
序列化時!我想從輸出文件中去掉「@class」屬性。有沒有人知道我如何告訴傑克遜不要爲我的Duck
添加「@class」屬性?
感謝您的偉大的答案!不幸的是,您的解決方案對我無效。註釋似乎被忽略。也許它被超類(動物)上的@JsonTypeInfo推翻了? –
我看着源代碼,這應該已經工作。我將添加一個自定義序列化程序到我的答案。 – stevedbrown
謝謝!也許我正在使用舊版本的Jackson或其他軟件。 –