Question

J'essaie de désérialiser un objet JSON-RPC avec Jackson.Le format du JSON-RPC est :

{ "résultat":"quelque chose", "erreur":null, "identifiant":1}

Dans mon cas, la propriété result est un objet générique.

J'ai un cours pour désériliser la réponse :

public class JsonRpcResponse {

private Object result;
private JsonRpcError error;
private int id;

public int getId() {
    return id;
}

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

public JsonRpcError getError() {
    return error;
}

public void setError(JsonRpcError error) {
    this.error = error;
}

public Object getResult() {
    return result;
}

public void setResult(Object result) {
    this.result = result;
}

}

Je peux obtenir l'objet de réponse avec :

 JsonRpcResponse jsonResp = mapper.readValue(response, JsonRpcResponse.class);

Je souhaite avoir une méthode générique qui désérialise cet objet résultat en passant à la méthode le type de l'objet (ou la classe si vous le souhaitez) qui va être désérialisé.De cette façon, je peux transmettre n'importe quel type d'objet en fonction de la réponse que j'attends.

Par exemple, j'ai cette classe avec deux propriétés :

public class JsonEventProperties {

private String conditon;
private String usage;

public JsonEventProperties(String condition, String usage) {
    this.conditon = condition;
    this.usage = usage;
}

public JsonEventProperties() {
    throw new UnsupportedOperationException("Not yet implemented");
}

public String getConditon() {
    return conditon;
}

public void setConditon(String conditon) {
    this.conditon = conditon;
}

public String getUsage() {
    return usage;
}

public void setUsage(String usage) {
    this.usage = usage;
}    

}

L'objet résultat à l'intérieur de la réponse pour le cas ci-dessus sera :

"result": {"condition":"test","usage":"optional"}

J'ai essayé:

mapper.readValue(result,objectClass)

où result est une instance JsonNode du résultat (qui, pour une raison quelconque, est un LinkedHashMap) et objectClass la classe vers laquelle je souhaite qu'il soit désérialisé.Mais ça ne fonctionne pas.

Je me suis cassé la tête toute la journée avec différentes manières de procéder, mais je ne comprends probablement pas qui travaille Jackson.

Est-ce que quelqu'un peut m'aider avec ça?

Merci d'avance.

Était-ce utile?

La solution

Je comprends que la question initiale concernait la désérialisation polymorphe de l'objet "résultat".

Jackson dispose désormais d'un mécanisme intégré disponible pour cela, utilisant le @JsonTypeInfo et @JsonSubTypes annotations.(ObjectMapper propose des méthodes comme alternatives à l'utilisation des annotations.) De plus amples informations sont disponibles dans la documentation officielle à l'adresse http://wiki.fasterxml.com/JacksonPolymorphicDeserialization.De plus, j'en ai publié quelques exemples d'utilisation sur http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html.

Cependant, si vous êtes bloqué dans la désérialisation d'un JSON qui, dans l'objet cible, n'a pas d'élément identifiant le type par un nom, vous êtes alors bloqué avec une désérialisation personnalisée, que vous devrez déterminer en fonction du contenu de l'objet. quel devrait être le type.L'un des derniers exemples du même blog publié ci-dessus démontre cette approche, en utilisant l'existence d'éléments JSON particuliers dans l'objet cible pour déterminer le type.

Autres conseils

Découvrez jsonrpc4j sur github :

https://github.com/briandilley/jsonrpc4j

J'ai eu le même problème, c'était ma solution.

J'ai ajouté un champ supplémentaire à l'objet, donc lors de la construction de l'objet, je définis la valeur du champ avec le nom de la classe, lors de sa désérialisation, j'utilise mapper.convertvalue(object, Class.forName(field value)

Dans ton cas private Object result;

Dans l'objet résultat, ajoutez un champ supplémentaire "className", tout en sérialisant la classe, définissez la valeur "className" avec le nom de la classe que vous traitez comme objet résultat.

en désérialisant l'objet JsonRpcResponse jsonResp = mapper.readValue(response, JsonRpcResponse.class);

dans jsonResp vous aurez Object result, String className, ici l'objet est de type linkedhashmap

Maintenant, convertissez-vous en votre objet

objectmapper.convertValue(result, Class.forName(className))

Le code ci-dessus vous obtiendra l'objet générique que vous souhaitez.

J'espère que cela t'aides

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top