2010-11-16 25 views
20

J'ai un objet JSON, par exemple:Reliure propriété enfant objet JSON dans le champ d'objet Java à Jackson

{ 
    "foo": { 
    "bar": 1 
    }, 
    "baz": 2 
} 

et je veux lier dans un objet Java, comme:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Foo { 
    private int bar; 
    @JsonProperty("baz") 
    private int baz; 
} 

Comment puis-je définir la valeur de foo.bar de JSON au champ bar dans l'objet Java Foo?

J'ai essayé d'annoter le champ avec @JsonProperty("foo.bar"), mais cela ne fonctionne pas comme ça.

Répondre

43

Ce n'est pas parfait mais c'est la manière la plus élégante que j'ai pu comprendre.

@JsonProperty("foo") 
public void setFoo(Map<String, Object> foo) { 
    bar = (Integer) foo.get("bar"); 
} 
2

Il n'y a pas de fonctionnalité automatisée pour cela (pour autant que je sache), mais c'est une fonctionnalité assez souvent demandée; il y a ce Jira RFE: http://jira.codehaus.org/browse/JACKSON-132 qui ressemble à ce que vous cherchez.

+0

Oui, c'est la même question, mais je l'utilise pour désérialisation . Je suppose que ma solution ci-dessus est la meilleure que je puisse obtenir si je ne veux pas changer la structure de l'objet 'Foo'. – hleinone

+0

Oui, je le pense. – StaxMan

-16

C'est comme fixer une pomme à une orange! Une autre "phrase accrocheuse" serait, "Impedance Mismatch", ou dans Star Trek 1, "Non Sequetor!" Liez-le à un objet MATCHED, puis effectuez une nouvelle affectation en Java entre les différents types d'objets.

+8

Pas vraiment utile. Je ne voudrais pas créer des classes Java inutiles juste parce que quelqu'un ne pourrait pas concevoir une API JSON décente. – hleinone

+3

D'accord avec @hleinone. On n'a pas toujours le contrôle de l'API et avoir à créer des classes/maps/hacks/vaudou imbriquées n'est pas la bonne solution. – kontinuity

-3

Voici un exemple rapide qui fonctionne:

JSON:

[{"function":{"name":"Function 1"}}, 
{"function":{"name":"Function 2"}}] 

Java:

import java.util.Map; 

import javax.xml.bind.annotation.XmlRootElement; 

import lombok.Getter; 
import lombok.Setter; 
import lombok.ToString; 

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
@Getter 
@Setter 
@ToString 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Function { 
    @JsonProperty("name") 
    private String name; 

    @JsonProperty("function") 
    public void setFunction(Map<String, Object> function) { 
     name = (String) function.get("name"); 
    } 
} 
+1

Ceci n'est pas différent de la réponse acceptée. – hleinone

+1

Pourquoi la nécessité d'inclure un tas de choses Lombok dans votre réponse? Il aurait effectivement le même résultat sans ceux-ci. –