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
但我不知道我在做什麼錯,也不知道如何解決它。感謝您對長期問題的幫助和道歉,我想盡可能地給出更多的上下文。
哇哦,我覺得愚蠢哈哈,但是,是它的工作,謝謝。 – abril