`

初步了解jackson

阅读更多

简单的使用jackson的annotation

@JsonAutoDetect (class)

这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象

@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段

 

如题,以一个用户对象为例子:

 

Java代码 复制代码
  1. @Entity  
  2. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
  3. @JsonAutoDetect  
  4. /**  
  5. * 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个  
  6. * 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,  
  7. * 如果你想转换的时候忽略某个属性,可以在后面继续加上  
  8. */  
  9. @JsonIgnoreProperties(value = {"hibernateLazyInitializer""password"})   
  10. public class User   
  11. {   
  12.     private Long id;   
  13.     private String name;   
  14.     private String password;   
  15.     private String email;   
  16.     private Date createAt;   
  17.     @Id  
  18.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  19.     public Long getId() {   
  20.         return id;   
  21.     }   
  22.   
  23.     public void setId(Long id) {   
  24.         this.id = id;   
  25.     }   
  26.     /**  
  27.     * 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文      
  28.         */  
  29.     @JsonSerialize(using = CustomDateSerializer.class)   
  30.     public Date getCreateAt() {   
  31.             return createAt;   
  32.     }   
  33.   
  34.     public void setCreateAt(Date createAt) {   
  35.             this.createAt = createAt;   
  36.     }   
  37.     /**  
  38.     * 其他的getter和setter省略  
  39.     */  
  40. }  
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonAutoDetect
/**
* 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个
* 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,
* 如果你想转换的时候忽略某个属性,可以在后面继续加上
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "password"})
public class User
{
	private Long id;
	private String name;
	private String password;
	private String email;
	private Date createAt;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
	/**
	* 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文	
        */
	@JsonSerialize(using = CustomDateSerializer.class)
	public Date getCreateAt() {
			return createAt;
	}

	public void setCreateAt(Date createAt) {
			this.createAt = createAt;
	}
	/**
	* 其他的getter和setter省略
	*/
}

 

至于中间的什么service,dao都大同小异就不记录了

转到struts2 看看一个用jackson返回json对象的action是如何写的

Java代码 复制代码
  1. @Namespace("/security/user")   
  2. public class UserAction extends ActionSupport   
  3. {   
  4.     @Action("list")   
  5.     public String list() throws Exception {   
  6.             // 取得所有的用户   
  7.             List<User> list = userService.getAll();   
  8.             response = ServletActionContext.getResponse();   
  9.             // jackson   
  10.             ObjectMapper mapper = new ObjectMapper();   
  11.             // 把取得的用户list写入response   
  12.             mapper.writeValue(response.getWriter(), list);   
  13.             return null;   
  14.     }   
  15. }  
@Namespace("/security/user")
public class UserAction extends ActionSupport
{
	@Action("list")
	public String list() throws Exception {
			// 取得所有的用户
			List<User> list = userService.getAll();
			response = ServletActionContext.getResponse();
			// jackson
			ObjectMapper mapper = new ObjectMapper();
			// 把取得的用户list写入response
			mapper.writeValue(response.getWriter(), list);
			return null;
	}
}

 这样我们在浏览器访问http://yourdomain/security/user/list就可以返回一个包含所有用户信息的json数组

 

hibernate延时加载

因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读取里面一个不能被反射操作的属性就产生了这个异常.  

 

不过我用的是jackson来转json,所以想到了用annotation来排除hibernateLazyInitializer 这个属性

在你的pojo类声明加上:

 

Java代码 复制代码
  1. @JsonIgnoreProperties(value={"hibernateLazyInitializer"})  

 

转换格式设置

近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:

1.普通的方式:

默认是转成timestamps形式的,通过下面方式可以取消timestamps。

Java代码 复制代码
  1. objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);  
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

 这样将使时间生成使用所谓的use a [ISO-8601 ]-compliant notation, 输出类似如下格式的时间: "1970-01-01T00:00:00.000+0000".

当然也可以自定义输出格式:

Java代码 复制代码
  1. objectMapper.getSerializationConfig().setDateFormat(myDateFormat);  
objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
Java代码 复制代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查java API  
myDateFormat对象为java.text.DateFormat,具体使用清查java API

2.annotaion的注释方式:

先定义自己需要的格式,例如:

Java代码 复制代码
  1. import java.io.IOException;   
  2. import java.text.SimpleDateFormat;   
  3. import java.util.Date;   
  4. import org.codehaus.jackson.JsonGenerator;   
  5. import org.codehaus.jackson.JsonProcessingException;   
  6. import org.codehaus.jackson.map.JsonSerializer;   
  7. import org.codehaus.jackson.map.SerializerProvider;   
  8.   
  9. /**  
  10.  *  java日期对象经过Jackson库转换成JSON日期格式化自定义类  
  11.  * @author godfox  
  12.  * @date 2010-5-3  
  13.  */  
  14. public class CustomDateSerializer extends JsonSerializer<Date> {   
  15.   
  16.         @Override  
  17.         public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {   
  18.                 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");   
  19.                 String formattedDate = formatter.format(value);   
  20.                 jgen.writeString(formattedDate);   
  21.         }   
  22. }  
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

/**
 *  java日期对象经过Jackson库转换成JSON日期格式化自定义类
 * @author godfox
 * @date 2010-5-3
 */
public class CustomDateSerializer extends JsonSerializer<Date> {

        @Override
        public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                String formattedDate = formatter.format(value);
                jgen.writeString(formattedDate);
        }
}

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

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

 

更多可以参考:http://wiki.fasterxml.com/JacksonAnnotations

分享到:
评论
1 楼 cuidongdong1234 2012-05-24  
有没有源码分析呀?

相关推荐

    Spring-Boot - 初步搭建

    【Spring-Boot初步搭建】 Spring-Boot 是由 Pivotal 团队提供的全新框架,它构建于 Spring 平台之上,旨在简化 Spring 应用的初始搭建以及开发过程。Spring-Boot 的核心设计理念是“约定优于配置”,它通过自动配置...

    LookAround开源代码移动互联网客户端使用众多第三方库做客户端开发初步可以学习借鉴。.zip

    2. **数据解析库**:如Gson或Jackson,它们用于将JSON或XML数据转化为Java对象,方便数据的处理和展示。 3. **地图库**:如Google Maps SDK或Mapbox,提供地图显示、定位、路径规划等功能。在LookAround中,地图...

    android面试题.rar

    - Android Jetpack Compose的初步了解,它是Google推出的现代化UI工具包。 在准备面试时,不仅需要理解这些知识点,还要能结合实际项目经验进行深入讨论,展示问题解决能力。同时,关注Android开发的最新动态,如...

    Android代码-LookAround开源代码移动互联网客户端使用众多第三方库做客户端开发初步可以学习借鉴。.zip

    其次,描述中提到"众多第三方库",这可能包括但不限于网络请求库(如Retrofit或OkHttp)、数据解析库(如Gson或Jackson)以及图片加载库(如Glide或Picasso)。这些库在Android应用开发中扮演着关键角色。例如,...

    JSON入门实战 (JAVA版)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于...通过以上介绍,你已经对JSON有了初步了解,并掌握了在Java环境中处理JSON的基本技能。接下来,你可以通过实际项目练习,进一步巩固这些知识。

    Systems Analysis and Design

    1. **初步调查**:收集基本信息,了解项目的背景和范围。 2. **详细调查**:深入研究现有系统,获取更详尽的数据和资料。 3. **需求分析**:根据业务需求和技术要求制定系统规格说明书。 4. **可行性分析**:评估...

    Map转成json

    首先,让我们了解Map。Map是一个集合,其中每个元素都是一个键值对,键是唯一的,用于标识对应的值。例如,在Java中,我们可以创建一个Map如下: ```java Map, Integer&gt; myMap = new HashMap(); myMap.put("apple",...

    project_demo

    - 初步了解Android Studio的环境配置和项目创建流程。 - 学习布局设计,包括XML布局和动态布局的创建,如线性布局、相对布局、网格布局等。 - 掌握基本UI组件的使用,如TextView、EditText、Button、ImageView等...

    HMM学习资料

    部分内容提供了对文档的初步了解。文档来自Surrey大学的视觉、语音和信号处理中心,提供了关于HMM基础、马尔可夫模型、HMM的似然度计算、最优状态序列(Viterbi算法)、重估计(Baum-Welch算法)、输出概率、模型的...

    毕设&课设&项目&实训-基于图灵机器人实现的Android智能应答APP.zip

    3. **JSON解析**:图灵机器人的API返回的数据通常是以JSON格式,因此需要了解如何使用Gson、Jackson或org.json等库来解析和序列化JSON对象。 4. **异步处理**:网络请求不应阻塞主线程,以免导致UI卡顿。因此,需要...

    android实战项目.zip

    服务器返回的数据通常是JSON格式,开发者需要了解如何使用Gson或Jackson库进行JSON解析,并将数据绑定到UI组件上,实现动态更新。 8. **权限管理与安全** 为了保护用户隐私,开发者需要处理好权限申请,如读写...

    网易新闻仿写第一阶段

    开发者可能需要了解Android开发的基本知识,如XML布局、Java或Kotlin编程、网络请求库的使用(如Retrofit或OkHttp)、数据解析(如Gson或Jackson)以及Android SDK的相关知识。此外,仿写过程中,对原网易新闻客户端...

    《软件工程》期末考试题及答案.pdf

    其中,瀑布模型是最基础的线性顺序模型,螺旋模型强调迭代和风险管理,原型模型用于快速创建初步系统,构件组装模型利用已有的组件构建系统,混合模型结合多种模型的优点。 2. **可行性研究**:可行性研究涉及经济...

    微服务架构Spring Cloud 之 Spring Cloud介绍及demo项目初步搭建(一)

    在 pom.xml 文件中,会包含 Lombok、Jackson、Servlet API 等依赖,以支持数据模型的构建和 JSON 序列化。 在项目中,我们可以定义如 `Item` 和 `Order` 这样的 POJO 类,使用 Lombok 注解简化代码,如 `@Data` ...

    商务汇报PPT模板-多彩-PPT模板.pptx

    在这里,您可以输入关于企业背景的关键信息,以便观众对您的公司有一个初步的了解。 “Summary corporative”模块是用于总结公司业绩或关键业务点的地方,您可以根据实际需求输入相应的文本,突出一年中的重要成就...

    软件工程大量题目.doc

    15. Jackson方法:在需求分析阶段,Jackson方法主要步骤包括标识实体与行为、生成实体结构图和创建软件系统模型,不包括了解实体行为。 16. 调试工作量:确定错误位置和原因通常占调试工作量的大约90%。 17. 软件...

    软件需求分析的任务和过程32045PPT课件.ppt

    - 初步用户手册:帮助用户了解软件的基本操作。 - 开发计划:规划开发流程和时间表。 6. 需求评审: - 确保目标一致性:验证系统定义是否与用户需求相符。 - 文档完整性:检查文档是否完整、清晰、准确地反映了...

    信息化综合资料软件工程需求分析基础知识.pptx

    这一阶段可以采用多种分析方法,如结构化分析方法(SA)、Jackson方法(JSD)、结构化数据系统开发方法(DSSD)和面向对象的分析方法(OOA)等。 在编制需求分析阶段的文档时,主要产出包括软件需求说明书、数据...

    Android源码——口袋微博服务器客户端代码.zip

    这个应用可能是一个简化版或学习示例,旨在帮助开发者了解如何实现一个与服务器进行交互的Android应用。我们将深入探讨这个项目中的关键知识点,主要集中在Android开发、网络通信和数据解析等方面。 1. **Android...

Global site tag (gtag.js) - Google Analytics