jackson 常见问题

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type

 

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class test.jackson.Employee]: can not instantiate from JSON object (need to add/enable type information?)

 at [Source: c:\temp\employee.json; line: 1, column: 2]

    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)

    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:483)

    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)

    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395)

    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1549)

    at test.jackson.JSONToJavaExample.main(JSONToJavaExample.java:19)

一般来说,解决上面问题从下面几个方面入手:

1、是否缺少默认构造函数

2、是否是类的访问修饰符问题,即jackson访问不到。

 

jackson 的UnrecognizedPropertyException错误

java代码如下:

  1. public class Student implements Serializable{ 
  2.     private static final long serialVersionUID = 685922460589405829L; 
  3.  
  4.     private String name; 
  5.     private String age; 
  6.  
  7.    /*get set略*/ 

json字符串如下:

"{\"address\":\"hunan\",\"name\":\"china\",\"age\":\"5000\"}"

 

这种情况下,使用jackson从string转换为object的时候,会抛出下面异常:

  1. java.lang.IllegalArgumentException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "address" (Class util.Student), not marked as ignorable 

意思是说Student类里没有address这个属性,所以无法正常转化,同时还指明了not marked as ignorable,即没有标明可忽略的特性

 

解决方案:

1、在类上添加忽略声明

@JsonIgnoreProperties(ignoreUnknown=true)

2、更改str2obj方法

   ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

 

Jackson annotation - How to rename element names?

you can rename a property just adding

@JsonProperty("contractor")

And by default Jackson use the getter and setter to serialize and deserialize.

 

Using a custom JsonSerializer.


public class Response {
  private String status;
  private String error;

  @JsonProperty("p")
  @JsonSerialize(using = CustomSerializer.class)
  private Object data;

  // ...
}

public class CustomSerializer extends JsonSerializer<Object> {
  public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeObjectField(value.getClass().getName(), value);
    jgen.writeEndObject();
  }
}

Could not read JSON: Can not construct instance of java.util.Date from String value ‘2012-07-21 12:11:12‘: not a valid representation

 

  1. "yyyy-MM-dd‘T‘HH:mm:ss.SSSZ"
  2. "yyyy-MM-dd‘T‘HH:mm:ss.SSS‘Z‘"
  3. "EEE, dd MMM yyyy HH:mm:ss zzz"
  4. "yyyy-MM-dd"

 

当尸实体中存在Date类型,但是json字符串中是字符串类型

只支持以上几种格式否则报错

 

  1.  
  2. /** 
  3. *  java日期对象经过Jackson库转换成JSON日期格式化自定义类 
  4. * @author godfox 
  5. * @date 2010-5-3 
  6. */ 
  7. public class CustomDateSerializer extends JsonSerializer<Date> { 
  8.  
  9.         @Override 
  10.         public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
  11.                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
  12.                 String formattedDate = formatter.format(value); 
  13.                 jgen.writeString(formattedDate); 
  14.         } 

 

然后在你的POJO上找到日期的get方法

Java代码  

  1. @JsonSerialize(using = CustomDateSerializer.class)  
  2.        public Date getCreateAt() {  
  3.                return createAt;  
  4.        }  
  1. @JsonSerialize(using = CustomDateSerializer.class) 
  2.        public Date getCreateAt() { 
  3.                return createAt; 
  4.        } 

 

 

  1. //null的JSON序列 
  2.     private class NullSerializer extends JsonSerializer<Object> { 
  3.         public void serialize(Object value, JsonGenerator jgen, 
  4.                 SerializerProvider provider) throws IOException, 
  5.                 JsonProcessingException { 
  6.             jgen.writeString(""); 
  7.         } 
  8.     } 

在spring的配置文件中定义这个自定义的Mapper

 

在spring的配置文件中定义这个自定义的Mapper

Xml代码

  1. <!-- 启动 MVC注解 -->
  2. <mvc:annotation-driven>
  3. <mvc:message-converters>
  4. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
  5. <property name="objectMapper" ref="customObjectMapper" />
  6. </bean>
  7. </mvc:message-converters>
  8. </mvc:annotation-driven>
  9. <!-- 自定义的JSON ObjectMapper -->
  10. <bean id="customObjectMapper" class="com.xixi.web4j.util.CustomObjectMapper" />

就这么简单,不用再像每个POJO对像上去@JsonSerializer(using...)了。

以后对所有DATE类型字段序列化JSON,都会默认传为“yyyy-MM-dd HH:mm:ss”格式,对于字段为null的也会转为“”。如果你对null有别的处理。你可以在自定义的NullSerializer修改你想要的格式。

时间: 2024-11-26 09:36:41

jackson 常见问题的相关文章

使用jackson转json解决双向关联循环调用

ITOO V1.0的开发算是告一段落了,现在是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和大家分享了,这次主要介绍转json循环调用的问题. 一.问题背景 相信只要使用ORM映射实体关联关系,实体中存在双向关联的都遇到过这样的问题: 其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的. 二.解决方案 由于刚java项目的经验不丰富,之前实体关系也没有这次项目中的复杂,所以没有解决过,不过学会

PHP常见问题及解答

当作PHP学习时,总是会在baidu上查很多的例如开发环境的选择呀,PHP好不好呀!或者是不是转学JAVA,或是.NET等: 首先本人是从2010年下半年开始报名学的PHP(IN Guangzhou),每周一天学了近6个月左右,从最基础的HTML,CSS,DIV,JAVASCRIPT,AJAX,PHP,然后学二次开发:闲暇之余还开通了一个个人blog( PHP wordpress); 由于个人工作原因,这几年放了一段时间未动PHP了,今年开始又自学了.NET; ---目的就想业余做一份兼职,锻炼

微信JS-SDK说明文档及常见问题处理

概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 此文档面向网页开发者介绍微信JS-SDK如何使用及相关注意事项. 使用说明 在使用微信JS-SDK对应的JS接口前,需确保公众号已获得使用对应JS接口的权限,可登录微信公众平台进入“开发者中心”查看对应的接口权限. 注意:

NHibernate常见问题及解决方法

NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end-of-text> (possibly an invalid or unmapped class name was used in the query)."错误查了好半天终于查到了.这篇文章是我转载的NHibernate的常见错误... hbm.xmlNHibernate文件中版本号可能引起的

NTB调试常见问题指南

作为实现不同PCI域乃至跨节点数据传输的重要器件,NTB在服务器和存储领域实现双控.内存互访等方面发挥着重要的作用.由于它本身既作为virtual port出现,又可以被互联的结点通过pci scan看到,作为一个link port出现,加之其上实现的地址转换和转发功能,在实际工程项目中,难免会碰到各种问题.本文结合笔者最近的工作,分享了NTB调试过程中常见的问题和解决思路和办法. 从问题的现象来看,具体常见问题包括: 找不到NTB设备: NTB mailbox无法传送数据: ReqID 无法探

SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结

一 开发环境 1.动态web工程 2.部分依赖 java代码: hibernate-release-4.1.0.Final.zip hibernate-validator-4.2.0.Final.jar spring-framework-3.1.1.RELEASE-with-docs.zip proxool-0.9.1.jar log4j 1.2.16 slf4j -1.6.1 mysql-connector-java-5.1.10.jar hamcrest 1.3.0RC2 ehcache 2

转:Web页面通过URL地址传递参数常见问题及检测方法

Web页面即我们在浏览器中所看到的网页,在Web应用程序中,其页面往往需要进行动态切换和数据交互,页面间的数据常规传递方法有多种,本文主要介绍Web页面处理程序中常见的URL地址参数传递方法,包括概述其实现原理.特点和常见问题,最后介绍检测该方式常见应用问题的测试思路和方法. 1.web页面的概念 Web是internet上一个非常重要的资源信息网,产生于20世纪90年代初,它遵循超文本传输协议,以超文本或超媒介的形式传送各种各样的信息,为用户提供了一个具有友好的图形化界面--Web页面,以便用

winpcap使用注意事项及常见问题

1.获取网卡设备名称.名称不是在ipconfig里显示的那样,而是需要调用函数pcap_findalldevs. 2.winpcap捕获3G网卡等拨号网络数据需要安装netmon,http://www.microsoft.com/en-us/download/details.aspx?id=4865. 3.winpcap默认只支持visual c++. 4.winpcap对拨号网络PPP只支持到XP系统.如果想要在Vista以上捕获3G数据包,可以购买能够将3G数据转换成以太网的3G网卡,如:H

java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 异常解决方案

问题: 在SpringMVC中使用Jackson实现json输出时配置如下: <!-- 输出对象转JSON支持 --> <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list>