2017-02-26 1 views
2

Si j'ai un POJO:Can Jackson/Gson peut-il me donner tous les noms de champs désérialisables connus?

public class Item { 

    @JsonProperty("itemName") 
    public String name; 
    private int quantity; 

    @JsonGetter("quantity") //call it "quantity" when serializing 
    public int getQuantity() {...} 

    @JsonSetter("number") //call it "number" when deserializing 
    public void setQuantity() {...} 
} 

ou même avec annotations Gson:

public class Item { 

    @SerializedName("itemName") 
    public String name; 

    @SerializedName("number") 
    private int quantity; 

    ... 
} 

est-il un moyen d'utiliser Jackson/Gson pour obtenir tous les noms de champs qu'il sauriez désérialiser (itemName et number dans ce cas)?

+0

Pouvez-vous préciser votre question. Je ne suis pas capable de suivre ce que vous demandez – Coder

Répondre

2

Ceci est pour Jackson:

public static List<String> getDeserializationProperties(Class<?> beanType) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    JavaType type = mapper.getTypeFactory().constructType(beanType); 
    BeanDescription desc = mapper.getSerializationConfig().introspect(type); 
    return desc.findProperties().stream() 
      .filter(def -> def.couldDeserialize()) 
      .map(def -> def.getName()) 
      .collect(Collectors.toList()); 
} 

Vocation:

System.out.println(getDeserializationProperties(Item.class)); 

Sortie:

[itemName, number] 
2

Pour Gson, la chose la plus proche pourrait être sérialisation un objet instancié seule et le convertir en arbre JSON afin d'extraire les propriétés de l'objet JSON:

final class Item { 

    @SerializedName("itemName") 
    String name; 

    @SerializedName("number") 
    int quantity; 

} 
final Gson gson = new GsonBuilder() 
     .serializeNulls() // This is necessary: Gson excludes null values by default, otherwise primitive values only 
     .create(); 
final List<String> names = gson.toJsonTree(new Item()) 
     .getAsJsonObject() 
     .entrySet() 
     .stream() 
     .map(Entry::getKey) 
     .collect(toList()); 
System.out.println(names); 

La sortie:

[itemName, nombre]

+0

Ok, j'ai enlevé le doublon. Désolé pour mon erreur. Et merci encore pour l'aide! Je vais demander sur Meta. – kaqqao

+0

@kaqqao De rien. :) –