简单的使用jackson的annotation
@JsonAutoDetect (class)
这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象
@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段
如题,以一个用户对象为例子:
- @Entity
-
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
-
@JsonAutoDetect
-
-
-
-
-
-
@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;
- }
-
-
-
-
@JsonSerialize(using = CustomDateSerializer.class)
-
public Date getCreateAt() {
-
return createAt;
- }
-
-
public void setCreateAt(Date createAt) {
-
this.createAt = createAt;
- }
-
-
-
- }
@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();
-
-
ObjectMapper mapper = new ObjectMapper();
-
- 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;
-
-
-
-
-
-
-
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
分享到:
相关推荐
Jackson 入门 Jackson 入门 Jackson 入门
jackson-databind jackson-annatation jackson-core jackson-mapper
jackson-annotations.jar jackson-core.jar jackson-databind.jar
jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-2.7.0版架包jackson-...
jackson2.9 搭配spring4使用,如果版本不符合,会出现“http请求415错误Unsupported Media Type”错误
Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被pass,还有就是谷歌的Gson(这个没用过不太了解)。 Spring MVC 的默认 json 解析器便是 ...
Jackson fasterxml和codehaus的区别: 他们是Jackson的两大分支、也是两个版本的不同包名。Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。除了包名不同,他们的Maven artifact id也不同。1.x...
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优势: (1)Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。 (2)相比json-lib框架,Jackson所依赖的jar包较少,只需下载:jackson-all-1.6.*.jar ~ jackson-all-...
jackson-annotations-2.9.5.jar ,jackson-core-2.9.5.jar,jackson-databind-2.9.5.jar
jackson 2.9.3 jar文件与jackson 2.9.3源码文件,打包成了一个zip
赠送jar包:jackson-annotations-2.13.1.jar; 赠送原API文档:jackson-annotations-2.13.1-javadoc.jar; 赠送源代码:jackson-annotations-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-...
Jackson jar包: jackson-annotations-2.5.0.jar jackson-core-2.5.0.jar jackson-databind-2.5.0.jar
赠送jar包:jackson-databind-2.12.5.jar; 赠送原API文档:jackson-databind-2.12.5-javadoc.jar; 赠送源代码:jackson-databind-2.12.5-sources.jar; 赠送Maven依赖信息文件:jackson-databind-2.12.5.pom; ...
开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 jackson-databind-2.8.6开发工具 ...
赠送jar包:jackson-databind-2.13.1.jar; 赠送原API文档:jackson-databind-2.13.1-javadoc.jar; 赠送源代码:jackson-databind-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-databind-2.13.1.pom; ...
jackson包,包括:jackson-annotations-2.2.1.jar、jackson-core-2.2.1.jar、jackson-core-asl-1.8.5.jar、jackson-core-asl-1.8.8.jar、jackson-core-lgpl-1.8.5.jar、jackson-databind-2.2.1.jar、jackson-mapper-...
jackson开发中用到的三个jar包,包含jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar jackson-databind-2.2.3.jar
开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-...
jackson2.7jar供大家使用