我有類似下面的代碼:設置JSON屬性名基於
public interface Animal {}
public class Dog implements Animal {
String tag = "ABC";
}
public class Eagel implements Animal {
int speed = 125;
}
public class World{
Animal animal;
}
狗應該然後導致這樣的事情:
{
"animal" : {
"tag" : "ABC"
}
}
問題:我如何重新命名財產「動物」,當動物是狗的時候是「狗」,而當它是一隻耳朵的時候,是「愛吉爾」?
試驗: 我最好的猜測是建立在這個像這樣的接口類:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "animal")
@JsonSubTypes({
@Type(value = Dog.class, name = "dog")
@Type(value = Eagel.class, name = "eagel")
public interface Animal {}
但不能得到它的工作。也嘗試使用@JsonRootName for Dog和Eagel而沒有任何結果。我是否應該使用@JsonSubTypes來工作?只能設法使用@JsonSubTypes添加屬性,而不能更改現有屬性。使用傑克遜2.7。我的JSON映射器也被設置爲:
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
編輯:最小完整的例子:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonNaming {
interface Animal {}
class Dog implements Animal {
private String tag = "ABC";
public Dog() {}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
class World {
@JsonSubTypes(@Type(value = Dog.class, name = "dog"))
private Animal animal;
public World() {}
public Animal getAnimal() {
return animal;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
}
public JsonNaming() {
World world = new World();
world.setAnimal(new Dog());
try {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(world);
System.out.println(json);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new JsonNaming();
}
}
結果:{ 「動物」:{ 「標籤」: 「ABC」}}
目標:{ 「狗」:{ 「標籤」: 「ABC」}}
拼寫nazi在這裏:它是Eagle,而不是Eagel :-) –
使用@JsonProperty(「key_name」)註釋爲要設置屬性名稱的字段 –