J'ai ce json: {"succès": faux}
Je veux désérialiser cela dans ce pojo: p> est-il possible de désérialiser ce Json dans une classe sans champ succès em>?
Jusqu'à présent, j'ai toujours eu la "expérience non reconnue: champ non reconnu" Succès "" P> Merci pour votre aide! P> P>
3 Réponses :
Vous pouvez implémenter une méthode et l'annoter avec @jsonanySetter code> comme ceci:
public static class Message {
private final Map<String, String> dataset = new HashMap<String, String>();
@Override
public String toString() {
return "Message [dataset=" + dataset + "]";
}
}
@Test
public void testJackson() throws JsonParseException, JsonMappingException, IOException {
String json = "{\"success\":false}";
ObjectMapper om = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
System.out.println(om.readValue(json, Message.class));
}
Si vous ne pouvez pas le faire fonctionner avec Jackson, ci-dessous est la manière dont vous pouvez prendre en charge ce cas d'utilisation avec MOxy. P> Aucune annotation n'est requis sur le message code> code>. Par défaut, l'accès à la propriété est utilisé. Vous pouvez spécifier un accès sur le terrain à l'aide de jaxb.properties strong> p> Pour spécifier MOxy comme fournisseur JAXB, vous devez inclure un fichier appelé Démo strong> p> @xmlAccessortype (xmlaccessype.field) code>, voir: http://blog.bdoughan.com/2011/06/USTION-JAXBS-XMLAccessorType-o.html . p>
jaxb .properties code> Dans le même package que votre modèle de domaine avec l'entrée suivante: p>
{"success":false}
Je ne comprends pas la question. Jackson (DE) Serialize de / à la version actuelle du message Pojo Vous avez défini dans la question originale, sans erreurs et sans configurations spéciales (autres que les annotations @jsonProperty). Le message actuel Pojo n'a pas de EM> Succès nommé, mais il définit le succès de la propriété Nommé, qui est pourquoi Jackson est heureux de mapper l'exemple JSE configurations supplémentaires. Voulez-vous supprimer les annotations @jsonProperty? Si c'est le cas, vous pouvez le faire, et Jackson sera toujours (DE) Serialize de / vers le message Pojo avec le même exemple JSON sans aucune autre configuration nécessaire, car Les signatures de méthode émetchccess et Setsuccess définissent déjà de manière adéquate que le message a une propriété nommée succès, qui correspond au nom de l'élément dans le JSON. P> Les exemples suivants démontrent ces points. P> Exemple 1 avec Message Pojo exactement tel que défini dans la question originale: p> exemple 2 avec le message POJO modifié pour supprimer @jsonProperty Annotations. P> public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
// input: {"success":false}
String inputJson = "{\"success\":true}";
ObjectMapper mapper = new ObjectMapper();
MessageWrapper wrappedMessage = mapper.readValue(inputJson, MessageWrapper.class);
System.out.println(mapper.writeValueAsString(wrappedMessage));
// output: {"success":true}
}
}
class MessageWrapper
{
@JsonUnwrapped
@JsonProperty // exposes non-public field for Jackson use
Message message;
}
Que je pensais ... mais je ne peux pas le faire fonctionner. Merci pour vos réponses. Évidemment, j'ai quelque chose qui ne va pas dans mon code.
Eh bien, en fait j'ai oublié quelque chose d'important ... je n'essaie pas de désérialiser ma chaîne JSON dans le message d'objet directement, mais dans une autre classe MessageWrapper qui comme référence à un message d'objet ... J'utilise l'annotation @jsonunwrappe sur le terrain. Message de MessageWrapper pour demander à la désérialisation du message d'objet. Suis-je obligé d'avoir mon godet / setter dans la classe racine MessageWrapper?
@yann "suis-je obligé d'avoir mon getter / setter dans la classe racine MessageWrapper?" - Non. Annotez simplement le champ Message dans MessageWrapper avec @ jsonunwrappe et avec @ JsonProperty (ou fournissez une autre manière pour Jackson de savoir utiliser le champ, par exemple, le rendre public (ne le faites pas réellement)). Je mettrai à jour la réponse ci-dessus pour inclure un tel exemple.