2011-12-07 12 views
37

JSONをObjectクラスに変換するのにjacksonを使用します。jackson認識されないフィールド

JSON:

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

オブジェクトクラス:

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

はコード:

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

私のコードは、そのような例外をスロー:

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

そして私はクラステストに小道具を追加したくないです、私はちょうどjacksonがTestにも存在する存在価値whithを変換したがっています。

答えて

71

ジャクソンは、「余分な」JSON要素の処理を構成するためのいくつかの異なるメカニズムを提供しています。以下は、ObjectMapperFAIL_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; 
} 

、内側列挙(DeserializationConfig.Feature)はスタンドアロン列挙(DeserializationFeature)に移動されたジャクソン2.0のようhttp://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

+1

これはとても驚きです!どうやってそれを手に入れましたか?ありがとうございました! – YETI

+20

2.xでは、代わりに['mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES、false);'](http://wiki.fasterxml.com/JacksonFeaturesDeserialization)を使用することに注意してください。 – Supr

36

を参照してください場合

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

Jackson 2.0(fasterxml)を使用しています

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

ビジネスロジックの故障を引き起こす可能性があるモデルの重要な変更に事前に気づくことが重要です。

この例外を手動で処理する方が、アプリケーションをより適切に制御する方がよいでしょう。 UnrecognizedPropertyException

静かに認識されていないフィールドを無視しないでくださいを処理するための

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

戻り

+0

「do not」と言うのは広すぎると思います。 apiのバージョンの変更に柔軟に対応するには、私はPostelの法則のファンです。 https://en.wikipedia.org/wiki/Robustness_principle –

関連する問題