2011-12-07 29 views
37

Uso jackson per convertire JSON in classe Object.jackson Campo non riconosciuto

JSON:

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

classe di oggetti:

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

Codice:

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

Il mio codice genera un'eccezione del genere:

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

E non voglio aggiungere un puntello al test della classe, voglio solo che Jackson converta il valore esistente che esiste anche in Test.

risposta

71

Jackson fornisce alcuni meccanismi diversi per configurare la gestione di elementi JSON "extra". Di seguito è riportato un esempio di configurazione di ObjectMapper in non 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; 
} 

Per altri approcci, vedere http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

+1

È così incredibile! Come hai capito!? Grazie mille! – YETI

+20

Nota che per 2.x devi usare ['mapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);'] (http://wiki.fasterxml.com/JacksonFeaturesDeserialization). – Supr

36

Come di Jackson 2.0 enum interno (DeserializationConfig.Feature) è stato spostato in un enum standalone (DeserializationFeature):

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

Se stai usando Jackson 2.0 (fasterxml)

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

È importante informare preventivamente il cambiamento critico del modello che può provocare la rottura della logica aziendale.

Per controllare meglio l'applicazione è meglio gestire questa eccezione 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; 
      } 
     }); 

ritorno vero gestire UnrecognizedPropertyException

Non ignorare i campi in silenzio non riconosciuti.

+0

Penso che sia troppo ampio per dire "non farlo". Quando si tratta di api e di essere flessibile alle versioni in evoluzione, sono un fan della legge di Postel. https://en.wikipedia.org/wiki/Robustness_principle –

Problemi correlati