加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – CustomDeserializer没有默认(无arg)构造函数

发布时间:2020-12-14 05:51:45 所属栏目:Java 来源:网络整理
导读:我正在使用RestTemplate来使用REST Api.我从API获得的响应有很多嵌套对象.这里有一个小片段作为例子: "formularios": [ { "form_data_id": "123006","form_data": { "form_data_id": "123006","form_id": "111","efs": { "1": {},"2": "{"t":"c","st"
我正在使用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

但我不确切地知道我做错了什么,也不知道如何解决它.感谢您对长期问题的帮助和道歉,我想尽可能多地提供上下文.

解决方法

您需要一个没有参数的默认构造函数.
你可以做的是创建一个(如果你真的不需要,可以替换另一个):
public class CustomDeserializer extends StdDeserializer<Efs> {

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读