2012-09-12 3 views
1

Je cherche la classe d'annotation JAXB qui peut être sérialisée au format json suivant. Format JSON: {"name":"xyz","attr1":"attr1value","attr2":"attr2value",.....}} Dans le format JSON ci-dessus, le nom est un attribut obligatoire, les autres ne le sont pas, mais l'utilisateur doit pouvoir transmettre autant d'attributs. La classe d'annotation JaxB ci-dessous qui peut être sérialisée au format JSON {"name":"xyz","openContentMap":{"attr1":"attr1value","attr2":"attr2value", so on}}. Mais nous voulons l'annotation JAXB qui peut être sérialisé ce format {"name":"xyz","attr1":"attr1value","attr2":"attr2value",.....}}Comment sérialiser ce format JSON par JAXB Annotation Class?

@XmlRootElement 
public class MyJaxbBean { 

private String name; 
private Map<String, String> openContentMap = new HashMap<String, String>(); 

@XmlAnyElement 
public Map<String, String> getOpenContentMap() { 
    return openContentMap; 
} 

@XmlAnyElement 
public void setOpenContentMap(String key, String value) { 
    openContentMap.put(key, value); 
} 

public String getName() { 
    return name; 
} 

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

public MyJaxbBean() { 
} 

}

Répondre

3

Utilisez org.codehaus.jackson.annotate.JsonAnyGetter et org.codehaus.jackson.annotate.JsonAnySetter

@XmlRootElement 
public class MyJaxbBean 
{ 
    private String name; 

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

    public String getName() 
    { 
     return name; 
    } 

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

    @JsonAnyGetter 
    public Map<String, String> getOpenContentMap() 
    { 
     return openContentMap; 
    } 

    @JsonAnySetter 
    public void add(final String key, final String value) 
    { 
     openContentMap.put(key, value); 
    } 
} 

fonctionne bien

String json = "{\"name\":\"xyz\",\"attr1\":\"attr1value\",\"attr2\":\"attr2value\"}"; 
    MyJaxbBean agr = new ObjectMapper().readValue(json, MyJaxbBean.class); 
    System.out.println(agr.getName() + " " + agr.getOpenContentMap()); 
Questions connexes