2017-04-04 16 views
3

RestTemplateでREST APIを使用しています。私がAPIから得ている応答には、多くの入れ子オブジェクトがあります。ここでは例として、少し抜粋です:CustomDeserializerにデフォルトの(引数なし)コンストラクタがありません

"formularios": [ 
    { 
    "form_data_id": "123006", 
    "form_data": { 
     "form_data_id": "123006", 
     "form_id": "111", 
     "efs": { 
     "1": {}, 
     "2": "{\"t\":\"c\",\"st\":\"m\",\"v\":[{\"id\":\"3675\",\"l\":\"a) Just an example\",\"v\":\"1\"},{\"id\":\"3676\",\"l\":\"b) Another example.\",\"v\":\"2\"}]}" 
     } 
    } 

私がいる問題は、時代のほとんどの「1」は実際には「2」のように、コンテンツを持っている、とジャクソンは単なる文字列としてそれを解析し、オブジェクト "efs"に追加します。しかし、コードスニペットと同じように、APIが空のまま送信し、JacksonがObjectとして取得すると、START_OBJECTについてのエラーが表示されます(正確なエラーは記憶できませんが、この質問には重要ではありません)。

私はカスタムデシリアライザを作ることにしました。そのため、jacksonが "1"と読むと、空のオブジェクトは無視され、null文字列として解析されます。ここで

は私のカスタムデシリアライザです:

public class CustomDeserializer extends StdDeserializer<Efs> { 

public CustomDeserializer(Class<Efs> t) { 
    super(t); 
} 

@Override 
public Efs deserialize(JsonParser jp, DeserializationContext dc) 
     throws IOException, JsonProcessingException { 

    String string1 = null; 
    String string2 = null; 
    JsonToken currentToken = null; 

    while ((currentToken = jp.nextValue()) != null) { 
     if (currentToken.equals(JsonToken.VALUE_STRING)) { 
      if (jp.getCurrentName().equals("1")) { 
       string1 = jp.getValueAsString(); 
      } else { 
       string2 = jp.getValueAsString(); 
      } 

     } else { 
      if (jp.getCurrentName().equals("2")) { 
       string2 = jp.getValueAsString(); 
      } 

     } 
    } 
    return new Efs(string1, string2); 

    } 
} 

そして、これがAPIからの応答を受信したとき、私はそれを使用している方法です。

ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule mod = new SimpleModule("EfsModule"); 
    mod.addDeserializer(Efs.class, new CustomDeserializer(Efs.class)); 
    mapper.registerModule(mod); 


    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); 
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter(); 
    jsonMessageConverter.setObjectMapper(mapper); 
    messageConverters.add(jsonMessageConverter); 


    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setMessageConverters(messageConverters); 

私はエラーを取得しています:

CustomDeserializer has no default (no arg) constructor 

しかし、私が間違ってやっていることや解決方法を正確にはわかりません。長い質問の助けと謝罪のおかげで、私はできるだけ多くの文脈を与えたいと思っていました。

答えて

5

引数のないデフォルトコンストラクタが必要です。

public class CustomDeserializer extends StdDeserializer<Efs> { 

    public CustomDeserializer() { 
     super(Efs.class); 
    } 
    ... 
} 
+0

すごいああ、私はダム笑を感じるが、ええ、それは、おかげで働いていた:あなたは何ができるか は1を作成(またはあなたが本当にそれを必要としない場合は、他のものを置き換える)です。 – abril

関連する問題