我正在使用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);
   }
   ...
}

java – CustomDeserializer没有默认(无arg)构造函数的更多相关文章

  1. angular – 如何推迟主要组件的相关组件的初始化,以便可以解决某些承诺

    p=preview.

  2. c – 改变一个对象的’this’指针来指向不同的对象

    这在编译时给我以下错误:我的意图:说有C类的对象a和b,C类的内容可以是非常巨大的,而且通过字段的复制可能是非常昂贵的.我想要以一种经济的方式将“a”的所有内容替换为b.默认的复制构造函数会执行预期的任务吗?

  3. c# – StreamReader的默认值是什么?

    我需要使用这个构造函数publicStreamReader(Streamstream,Encodingencoding,booldetectEncodingFromByteOrderMarks,intbufferSize,boolleaveOpen),以便将leaveOpen设置为true.为了做到这一点,我还需要设置其他参数(编码编码,intbufferSize).我想使用StreamReade

  4. c – 需要将析构函数声明为默认值

    根据these准则:Ifthedefaultdestructorisneeded,butitsgenerationhasbeensuppressed(e.g.,bydefiningamoveconstructor),use=default.我无法想象,如果没有明确的默认析构函数在类中具有移动构造函数的代码将不正确.有人可以告诉我上面的例子吗?解决方法我认为这是一种错误,默认析构函数的隐含声明与移动

  5. c – 为什么使用带有默认构造函数的括号会导致创建变量?

    2个看完路易斯·布兰迪在CppCon2017上的演讲后,我惊讶地发现这段代码实际编译:由于某种原因,std::string它与std::stringfoo相同,即声明一个变量.我发现它绝对违反直觉,并且看不出C以这种方式工作的任何理由.我希望这会给出关于未定义标识符foo的错误.它实际上使像token1这样的表达式具有比我之前想象的更多可能的解释.所以我的问题是:这种恐怖的原因是什么?这个规则什么时候真的有必要?

  6. C 11:分配给匿名实例的原始类型的默认构造函数

    )表达式都不一定意味着构造函数调用是一个常见的误解.实际上,T(…)表达式是一个功能转换表达式,可能在一些狭窄的特定情况下解决构造函数的调用,并且没有任何内容在其他情况下与任何构造函数有关.例如,这段代码保证用零初始化s,尽管类S具有不执行任何操作的默认构造函数.我特意提出了这个例子来说明即使在默认构造函数存在的情况下,T()表达式仍然可以完全忽略它,而是通过自己的规则工作.

  7. c – 默认移动构造函数和引用成员

    从N3337的[12.8][11]开始:Theimplicitly-definedcopy/moveconstructorforanon-unionclassXperformsamemberwisecopy/moveofitsbasesandmembers.[Note:brace-or-equal-initializersofnon-staticdatamembersareignored.Seea

  8. C 11中的工会:默认构造函数似乎被删除

    为什么Us1{};编译,但Us2;才不是?是否将联盟的默认ctor标记为已删除(如果是这样,为什么?!),而在第一种情况下,我们只是聚合初始化?

  9. 1.Cocos2d-x-3.2编写3d打飞机,粒子管理器代码

    =nullptr)//如果实例不为空{deleteParticleManager::m_pInstance;//清除单例}}};staticCGarbom_garbo;//定义内部类变量public:std::mapm_plistMap;//定义存放粒子数据的集合voidAddplistData;font-family:新宋体;font-size:9.5pt">stringstrName);//把粒子数据添加到集合里ValueMapGetPlistData;//从粒子集合中获取粒子数据};#endif/*

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

    我正在使用RestTemplate来使用RESTApi.我从API获得的响应有很多嵌套对象.这里有一个小片段作为例子:我遇到的问题是大多数时候“1”实际上有内容,就像“2”一样,而jackson只是将它解析为对象“efs”上的String.但有时候,就像在代码片段中一样,API将其发送为空,并且jackson将其作为对象,这给了我一个错误,说明了一些关于START_OBJECT的内容(不记得确切的

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部