2011-12-07 23 views
37

Utilizo jackson para convertir JSON en clase de objeto.jackson Campo no reconocido

JSON:

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

clase de objeto:

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

Código:

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

Mi código ha producido una excepción de esa manera:

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

Y no quiero agregar una clase a la prueba de clase, solo quiero que jackson convierta el valor de existencia que también existe en la prueba.

Respuesta

71

Jackson proporciona algunos mecanismos diferentes para configurar el manejo de elementos JSON "adicionales". A continuación se muestra un ejemplo de configuración de ObjectMapper a no 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; 
} 

Para otros enfoques, ver http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

+1

¡Es tan increíble! ¿Cómo lo conseguiste? ¡Muchas gracias! – YETI

+20

Tenga en cuenta que para 2.x debería usar ['mapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);'] (http://wiki.fasterxml.com/JacksonFeaturesDeserialization) en su lugar. – Supr

36

A partir de Jackson 2.0 el enum interior (DeserializationConfig.Feature) se ha movido a una enum independiente (DeserializationFeature):

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

Si está utilizando Jackson 2.0 (fasterxml)

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

Es importante tener en cuenta de antemano el cambio crítico del modelo que puede provocar la ruptura de la lógica comercial.

Para controlar mejor la aplicación, es mejor manejar esta excepción manualmente.

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

Volver cierto manejar UnrecognizedPropertyException

No ignore los campos en silencio no reconocidos.

+0

Creo que es demasiado amplio como para decir "no". Cuando se trata de api y de ser flexible a las versiones cambiantes, soy un fanático de la Ley de Postel. https://en.wikipedia.org/wiki/Robustness_principle –

Cuestiones relacionadas