2017-05-30 3 views
1

Pour certains cas d'utilisation, j'ai besoin de convertir un POJO en un autre POJO avec le nom de différents champs. J'ai essayé d'utiliser le mappeur d'objets Jackson. Cela a fonctionné dans certaines étendues. Cependant, le résultat final n'est pas ce que j'attendais.Spring boot, Jackson Json Problème lors de la sérialisation et de la désérialisation

public class JacksonTest { 

    public static void main(String[] args) throws IOException{ 
     ObjectMapper mapper = new ObjectMapper(); 
     User user = new User("Deepak", "111", "Singapore"); 
     UserMap newUser = mapper.convertValue(user, UserMap.class); 
     System.out.println("SOUT: " + newUser); 
     System.out.println("Jackson: " + mapper.writeValueAsString(newUser)); 
    } 
} 

class User { 

    User(String name, String id, String address){ 
     this.name = name; 
     this.id = id; 
     this.address = address; 
    } 

    String name; 
    String id; 
    String address; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

class UserMap implements Serializable { 
    @JsonProperty("name") 
    String name; 

    private Map<String, Object> meta = new HashMap<>(); 

    @JsonAnyGetter 
    public Map<String, Object> any() { 
     return meta; 
    } 

    @JsonAnySetter 
    public void set(String name, Object value) { 
     meta.put(name, value); 
    } 

    @Override 
    public String toString() { 
     return "UserMap{" + 
       "name_new='" + name + '\'' + 
       ", meta=" + meta.keySet().stream().map(x-> x+ ":: "+ meta.get(x)).collect(Collectors.joining(", ")) + 
       '}'; 
    } 
} 

Si vous exécutez, la sortie serait:

SOUT: usermap {name_new = 'Deepak', meta = adresse :: Singapour, id :: 111}

Jackson: { » nom ":" Deepak "," adresse ":" Singapour "," id ":" 111 "}

J'utilise Springboot qui utilise en interne le sérialiseur jackson. Il convertit à nouveau l'objet newUser en classe d'utilisateur normale. Je veux sérialiser la chaîne dans la manière dont la classe est construite. Je veux la sortie au format SOUT.

Répondre

0

Je pense que vous avez mal compris ce que la paire @JsonAnyGetter/@JsonAnySetter fera, en effet, faire.

Il vous permet de créer un haricot presque dynamique, avec des champs obligatoires et volontaires. Dans votre cas, le nom serait obligatoire et tous les autres champs seraient facultatifs. Ce qui se passe sous le capot est pas que votre UserMap est converti en User. Ce que vous voyez est un UserMap sérialisé, mais comme il a les mêmes champs et valeurs que l'instance User correspondante, leurs formes sérialisées semblent identiques.

+0

Je comprends comment cela fonctionne. Pour certaines exigences, j'ai besoin de la manière de construire une classe d'objets. En ce moment je crée un POJO et je sens toutes ces données avant la sérialisation. – xdeepakv

+0

@DeepakSharma Je ne comprends pas ce que vous voulez dire par "j'ai besoin de la manière de construire une classe d'objets". En outre, quel est le problème avec la création d'un POJO et le remplissage des données avant de le sérialiser? – Dave