2016-07-13 60 views
0

我有類似下面的代碼:設置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」}}

+0

拼寫nazi在這裏:它是Eagle,而不是Eagel :-) –

+0

使用@JsonProperty(「key_name」)註釋爲要設置屬性名稱的字段 –

回答

0

你爲什麼不使用JsonObjectBuilder

+0

乍一看「JsonObjectBuilder」不會生成正確的屬性名稱?我需要能夠從包含數百個屬性的類生成此類。 – Grains