2017-04-04 71 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會將其發送爲空,並且傑克遜將其作爲對象,這給了我一個關於START_OBJECT的錯誤(不記得確切的錯誤,但對於這個問題並不重要)。

所以我決定做一個自定義的反序列化器,所以當jackson讀取「1」時,它會忽略空對象,並將其解析爲空字符串。

這裏是我的自定義解串器:

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

哇哦,我覺得愚蠢哈哈,但是,是它的工作,謝謝。 – abril

相關問題