6
votes

Désérialiser Json avec Jackson sans champ approprié

J'ai ce json: {"succès": faux}

Je veux désérialiser cela dans ce pojo: xxx

est-il possible de désérialiser ce Json dans une classe sans champ succès ? Jusqu'à présent, j'ai toujours eu la "expérience non reconnue: champ non reconnu" Succès ""

Merci pour votre aide!


0 commentaires

3 Réponses :


6
votes

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));
}


0 commentaires

0
votes

Note: strong> Je suis le Eclipselink Jaxb (Moxy ) strong> plomb et membre du JAXB (JSR -222) strong> groupe d'experts.

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>

Message strong> 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 @xmlAccessortype (xmlaccessype.field) code>, voir: http://blog.bdoughan.com/2011/06/USTION-JAXBS-XMLAccessorType-o.html . p> xxx pré>

jaxb.properties strong> p>

Pour spécifier MOxy comme fournisseur JAXB, vous devez inclure un fichier appelé jaxb .properties code> Dans le même package que votre modèle de domaine avec l'entrée suivante: p> xxx pré>

Démo strong> p>

{"success":false}


0 commentaires

0
votes

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> xxx pré>

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;
}


3 commentaires

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.