@JsonAutoDetect (class)
这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象
@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段
如题,以一个用户对象为例子:
- @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省略
- */
- }
- @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是如何写的
- @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;
- }
- }
- @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类声明加上:
- @JsonIgnoreProperties(value={"hibernateLazyInitializer"})
转换格式设置
近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:
1.普通的方式:
默认是转成timestamps形式的,通过下面方式可以取消timestamps。
- 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".
当然也可以自定义输出格式:
- objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
- objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
- myDateFormat对象为java.text.DateFormat,具体使用清查java API
- myDateFormat对象为java.text.DateFormat,具体使用清查java API
2.annotaion的注释方式:
先定义自己需要的格式,例如:
- 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);
- }
- }
- 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方法
- @JsonSerialize(using = CustomDateSerializer.class)
- public Date getCreateAt() {
- return createAt;
- }
更多可以参考:http://wiki.fasterxml.com/JacksonAnnotations
相关推荐
4. 如果使用XML配置,可以在`<mvc:annotation-driven>`标签内添加`<mvc:message-converters>`,并指定`jackson-mapper-asl`或`jackson-databind`的全限定类名。 确保这些配置正确无误后,Spring MVC应该能正常处理...
Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、转换JSON数据。在Spring MVC框架中,Jackson库通常用于处理HTTP请求和响应中的JSON数据,使得Java对象能够方便地序列化为JSON...
Jackson的jar资源包2.4.1版本包含jackson-annotation-2.4.1.jar,jackson-core-2.4.1.jar,jackson-databind-2.4.1.jar。
了解了这些组件后,我们来看看在Spring 4.X中如何使用Jackson: 1. **配置Spring**:在Spring的配置文件中,可以通过`<mvc:annotation-driven>`标签启用基于注解的控制器,这会自动配置Jackson作为默认的HTTP消息...
Jackson是Java领域中广泛使用的高性能JSON处理库,其2.9.2版本是该库的一个稳定版本,提供了高效且功能丰富的JSON序列化和反序列化功能。Jackson库由三个主要模块组成,这些模块在给定的压缩包文件中分别对应为: 1...
reseponsebody注解所需支持jar包,json自动序序列化。
jackson-databind-2.9.10.8.jar升级相关jar包包含: jackson-module-jaxb-annotations-2.9.10.jar jackson-core-2.9.10.jar jackson-databind-2.9.10.8.jar jackson-annotations-2.9.10.jar jackson-jaxrs-json-...
Jackson是Java中广泛使用的JSON处理库,它提供了多种功能,如JSON序列化、反序列化、数据绑定等。Jackson分为多个模块,包括`jackson-databind`、`jackson-core`和`jackson-annotations`等。在早期版本中,这些模块...
jackson开发中用到的三个jar包,包含jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar jackson-databind-2.2.3.jar
分享一个使用SpringMVC4 Rest 和Jackson的@JsonView注解集成的实例。@JsonView用来过滤JSON响应。Spring4.1开始直接支持@JsonView注解。要使用@JsonView,首先我们需要定义视图,我们可以定义多个视图。一个视图定义...
Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的序列化和反序列化功能,使得Java对象能够轻易地转换为JSON格式,反之亦然。在本文中,我们将深入探讨Jackson库的基本用法,包括如何安装、配置,以及如何将...
Jackson是Java领域中广泛使用的JSON处理库,由FasterXML团队维护。它提供了高效、灵活且强大的JSON处理能力,包括将Java对象转换为JSON字符串(序列化)和从JSON字符串反向构建Java对象(反序列化)。在Spring MVC中...
com.fasterxml.jackson.annotation.JsonGetter 就是这个JAR包
jackson-annotations-2.9.6.jar是Jackson的注解支持包。
Jackson所依赖的一些资源包(commons-beanutils-1.7.0\commons-beanutils-1.7.0\commons-beanutils-1.7.0\ezmorph-1.0.2\jackson-core\json-lib-2.3-jdk15\jackson-mapper)
Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、序列化和反序列化JSON数据。标题中的"jackson-core-asl-1.7.2.jar"和描述中提到的"jackson-mapper-asl-1.7.2.jar"是Jackson库...
这个问题通常与服务器端的数据序列化配置有关,而Jackson库是Java世界中广泛使用的JSON处理库,能够帮助我们解决这类问题。本篇将深入探讨406错误的原因以及如何利用Jackson库进行修复。 406错误表示服务器生成的...
Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、序列化和反序列化JSON数据。标题中的"Jackson2.2.3.rar"表明这是一个包含Jackson库版本2.2.3的压缩包,其中可能包含了三个核心...
本文将深入探讨如何在Android中使用Jackson进行JSON解析,并通过手打Demo来展示其实用性和高效性。 首先,我们需要引入Jackson库。在`build.gradle`文件中添加依赖: ```groovy dependencies { implementation '...
4. `fasterxml.jackson.jaxrs`模块:提供JAX-RS(Java API for RESTful Web Services)集成,使得在REST服务中使用Jackson变得简单。 5. `fasterxml.jackson.databind.module`模块:允许用户自定义模块,以便扩展...