2011-12-07 13 views
37

Używam jackson do konwersji JSON do klasy Object.jackson Nierozpoznane pole

JSON:

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

obiektu klasy:

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

Kod:

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

Mój kod wyrzuca wyjątek tak:

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

I nie chcę dodawać podpory do testu klasy, chcę tylko, aby konwertować jackson wartość istnieje, która istnieje również w teście.

Odpowiedz

71

Jackson udostępnia kilka różnych mechanizmów konfigurujących obsługę "dodatkowych" elementów JSON. Poniżej przedstawiono przykład konfiguracji ObjectMapper do , aby nie .

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

przypadku innych podejść, zobaczyć http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

+1

To takie niesamowite! Jak to zrobiłeś? Dziękuję bardzo! – YETI

+20

Należy pamiętać, że dla wersji 2.x można zamiast tego użyć ['mapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);]] (http://wiki.fasterxml.com/JacksonFeaturesDeserialization). – Supr

36

As Jackson 2,0 wewnętrzna enum (DeserializationConfig.Feature) został przeniesiony do samodzielnego wyliczenia (DeserializationFeature):

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

Jeśli używasz oprogramowania Jackson 2.0 (szybciejxml)

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

Ważne jest, aby z wyprzedzeniem zauważyć krytyczną zmianę modelu, która może spowodować podział logiki biznesowej.

Aby lepiej kontrolować aplikację, lepiej jest obsługiwać ten wyjątek ręcznie.

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

Powrót prawda obsłużyć UnrecognizedPropertyException

Nie ignoruj ​​pola cicho nierozpoznane.

+0

Myślę, że jest zbyt szeroki, by po prostu powiedzieć "nie". Jeśli chodzi o api i elastyczność w zmianie wersji, jestem fanem Postel's Law. https://en.wikipedia.org/wiki/Robustness_principle –

Powiązane problemy