41 votes

jackson Champ non reconnu

J'utilise jackson pour convertir JSON en classe Objet.

JSON :

{
    "aaa":"111",
    "bbb":"222", 
    "ccc":"333" 
}

Classe d'objet :

class Test{
    public String aaa;
    public String bbb;
}

Code :

ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(content, valueType);

Mon code lance l'exception comme ça :

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable

Et je ne veux pas ajouter un accessoire à la classe Test,je veux juste que jackson convertisse la valeur exist avec existe aussi dans Test.

80voto

Programmer Bruce Points 16306

Jackson fournit quelques mécanismes différents pour configurer la gestion des éléments JSON "supplémentaires". Voici un exemple de configuration du ObjectMapper pour ne pas FAIL_ON_UNKNOWN_PROPERTIES.

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    // { "aaa":"111", "bbb":"222", "ccc":"333" }
    String jsonInput = "{ \"aaa\":\"111\",
                          \"bbb\":\"222\",
                          \"ccc\":\"333\" }";

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,
                         Visibility.ANY);
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                     false);

    Test test = mapper.readValue(jsonInput, Test.class);
  }
}

class Test
{
  String aaa;
  String bbb;
}

Pour d'autres approches, voir http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

41voto

Owen Pauling Points 222

Depuis Jackson 2.0, l'ENUM interne (DeserializationConfig.Feature) a été déplacé vers un ENUM autonome (DeserializationFeature) :

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

20voto

Aalkhodiry Points 561

Si vous utilisez Jackson 2.0 (fasterxml)

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

9voto

Flinbor Points 131

Il est important de noter au préalable les changements critiques du modèle qui peuvent entraîner la rupture de la logique métier.

Pour un meilleur contrôle de l'application, il est préférable de gérer cette exception manuellement.

objectMapper.addHandler(new DeserializationProblemHandler() {

            @Override
            public boolean handleUnknownProperty(DeserializationContext ctxt,
                    JsonParser jp, JsonDeserializer<?> deserializer,
                    Object beanOrClass, String propertyName)
                    throws IOException, JsonProcessingException {

                String unknownField = String.format("Ignoring unknown property %s while deserializing %s", propertyName, beanOrClass);
                Log.e(getClass().getSimpleName(), unknownField);
                return true;
            }
        });

Retourner true pour gérer UnrecognizedPropertyException

N'ignorez pas les champs non reconnus en silence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X