2011-06-27 3 views
3

J'ai un objet JSON dont je n'ai pas le contrôle et que je veux mapper à un objet Java qui est pré-créé. Il existe un attribut dans l'objet JSON qui peut être une URL ou un objet JSONArray.Jackson JSON vers le mappage Java pour le même attrubute avec un type de données différent

Class SomeClass { 

    private URL items; 

    public URL getURL() { 
     return items; 
    } 

    public void setURL(URL url) { 
     this.items = url; 
    } 
} 

est inférieure à la JSON:

Cas A:

{ 
... 
    items: http://someurl.abc.com/linktoitems, 
... 
} 

OU

Cas B

{ 
... 
    items: [ 
      { "id": id1, "name": name1 }, 
      { "id": id2, "name": name2 } 
      ] 
... 
} 

Si je crée le POJO à la carte pour les cas A , Le cas B échoue et vice versa. En bref, existe-t-il un moyen de mapper l'attribut JSON au champ POJO avec différents types de données? Dans ce cas, je vais créer deux champs distincts dans le POJO nommé,

private URL itemLink; 
private Item[] itemList; 

Répondre

2

Cela dépend des détails précis, mais si ce que vous demandez est s'il est possible de la carte JSON chaîne ou un tableau JSON dans une propriété Java , oui cela peut être fait.

Une manière évidente serait de définir un désérialiseur personnalisé qui gère les deux types d'entrée JSON. Mais il est également possible de définir le type Java de manière à pouvoir le construire en définissant des propriétés (qui fonctionne à partir de l'objet JSON) et avoir un constructeur unique-String-arg ou une chaîne statique unique-String-arg @JsonCreator. Une autre possibilité consiste à utiliser un type intermédiaire pouvant être désérialisé à partir de n'importe quel JSON: les instances java.lang.Object et JsonNode ("arbre JSON") peuvent être créées à partir de n'importe quel JSON. À partir de cette valeur, vous devrez effectuer une conversion manuelle. très probablement setter, comme ceci:

public void setItems(JsonNode treeRoot) { .... } 

Ce qui ne fonctionne pas, cependant, est en train de définir deux propriétés du même nom.

Une chose que je ne suis pas tout à fait est de savoir comment vous convertir de la liste à l'URL si. Alors peut-être que vous avez réellement besoin de deux champs internes distincts; et setter attribuerait juste à un de ceux-là (et getter renverrait la valeur d'un seul).

+0

Merci pour la réponse. Cependant, j'identifie manuellement le type de données de la clé et j'affecte la valeur à l'objet approprié (URL ou liste) – user788052

Questions connexes