2011-03-08 6 views
6

J'ai quelque chose comme client JSON-RPC, et j'ai des problèmes de désérialisation chaîne json entrant dans mon objet java. Le format JSON entrant est:Désérialisation des tableaux avec Jackson

{"value":"xxxx","type":"xxxx"} 

L'objet que je veux désérialiser à:

@JsonAutoDetect 
@JsonDeserialize() 
public class ReturnValue { 

private Object value; 
private String type; 

@JsonCreator 
public ReturnValue(@JsonProperty("value") String val, @JsonProperty("type") String type) { 
    value = val; 
    this.type = type; 
} 

...getters, setters... 

Cela semble bien fonctionner, si la valeur est une chaîne, mais si ce dernier est de type tableau, il jette JsonMapping Exception - ne peut pas désérialiser instance de java.lang.String de jeton START_ARRAY pour le JSON comme ceci:

{\"value\":[8, 10], \"type\":\"[int]\"} 

Le code est:

int[] arr = (int[])getReturnValue(jsonString).getValue(); 

Où getReturnValue est rien de spécial:

ObjectMapper om = new ObjectMapper(); 
    ReturnValue rv = null; 
    rv = om.readValue(json, ReturnValue.class); 
    return rv; 

L'autre problème est que je veux la propriété type à être de type classe, mais ce serait jeter une autre exception de la cartographie . Est-ce qu'il y a un moyen à Jackson de le faire, ou dois-je convertir moi-même de la corde à la classe appropriée? Merci pour tout conseil.

Répondre

8

Changer votre constructeur être:

@JsonCreator 
public ReturnValue(@JsonProperty("value") Object val, @JsonProperty("type") String type) { 

puisque, comme l'erreur signale, il ne sait pas comment faire une chaîne de tableau. Mais String et JSON Array peuvent être convertis en Object; Si c'est le cas, ce sera Java String, ou Java List (pour les tableaux JSON), ou Java Map (pour les objets JSON).

+1

Oui, vous avez raison, merci :-) – mirekys

Questions connexes