我正在使用RestTemplate消费一个REST Api。我从API得到的响应包含很多嵌套对象。以下是一个小片段作为示例:
"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”一样,但是jackson将其解析为对象“efs”的字符串。但是有时,就像在代码片段中一样,API发送它为空,并且jackson将其视为对象,这会导致错误,该错误涉及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);
I'm getting the error:
CustomDeserializer has no default (no arg) constructor
但是我不知道具体哪里做错了,也不知道该如何解决。感谢您的帮助,对于这个长问题表示歉意,我想尽可能提供更多的背景信息。
JavaType
的父构造函数,并使用TypeFactory
传入所需类型。 - Edgar Asatryan