我正在使用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”上的String.但有时候,就像在代码片段中一样,API将其发送为空,并且jackson将其作为对象,这给了我一个错误,说明了一些关于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
但我不确切地知道我做错了什么,也不知道如何解决它.感谢您对长期问题的帮助和道歉,我想尽可能多地提供上下文.
解决方法
原文地址:https://www.jb51.cc/java/121046.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。