一 jackson对象和字符串及其数组对象和字符串相互转换
1.maven引入Jackson包
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.7.4version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-annotationsartifactId>
<version>2.7.4version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.7.4version>
dependency>
dependencies>
2.新建User类
import java.util.Date;
public class User {
private String mName;
private int age;
private Date birthday;
private String email;
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [mName=" + mName + ", age=" + age + ", birthday="
+ birthday + ", email=" + email + "]";
}
}
3.新建测试类
public class JacksonTest {
public static void main(String[] args) throws IOException {
User user=new User();
user.setAge(11);
user.setBirthday(new Date());
user.setEmail("123456");
user.setmName("jesse1");
ObjectMapper mapper = new ObjectMapper();
//当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
//因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// Convert object to JSON string
String json = mapper.writeValueAsString(user);
System.out.println(json);
// Convert Json string to Object
User user2=mapper.readValue(json, User.class);
System.out.println(user2);
User user3=new User();
user3.setAge(33);
user3.setBirthday(new Date());
user3.setEmail("123456");
user3.setmName("jesse3");
List users = new ArrayList();
users.add(user);
users.add(user3);
// Convert List
String json3 = mapper.writeValueAsString(users);
System.err.println(json3);
// Convert Json string to List
List users3=mapper.readValue(json3, new TypeReference>() {
});
for (int i = 0; i < users3.size(); i++) {
System.out.println(users3.get(i));
}
}
}
4.json常规注解,User类添加如下注解,再次运行测试类
/**
* Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。
@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。
@JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyyMMdd")
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把eMail属性序列化为mail,@JsonProperty("mail")
*/
public class User {
private String mName;
@JsonIgnore // 不JSON序列化年龄属性
private int age;
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") // 格式化日期属性
private Date birthday;
@JsonProperty("mail") // 序列化email属性为mail
private String email;
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [mName=" + mName + ", age=" + age + ", birthday="
+ birthday + ", email=" + email + "]";
}
}
二 SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意
一、SpringMVC使用@ResponseBody时返回json的日期格式
前提了解: @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJackson2HttpMessageConverter,它使用了Jackson 这个开源的第三方类库。主要是以下两个jar包:jackson-core-asl;jackson-mapper-asl。
<dependencies>
<dependency>
<groupId>org.codehaus.jacksongroupId>
<artifactId>jackson-core-aslartifactId>
<version>1.9.13version>
dependency>
<dependency>
<groupId>org.codehaus.jacksongroupId>
<artifactId>jackson-mapper-aslartifactId>
<version>1.9.13version>
dependency>
dependencies>
出现问题: 使用@ResponseBody时返回json字符串的日期格式。Date类型属性默认返回一个Long型的时间戳,怎样能够返回自定义的日期格式?
解决方案:目前有两种方式实现,
1、局部修改(网上较多,但不推荐);
继承Jackson的抽象类:JsonSerializer,然后在javabean的属性getter()上添加注解@JsonSerialize即可实现。
新建CustomDateSerializer类
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/** @description 自定义返回JSON 数据格中日期格式化处理 */
public class CustomDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator jsonGenerator,
SerializerProvider provider) throws IOException,
JsonProcessingException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
jsonGenerator.writeString(sdf.format(value));
}
}
User类的birthday属性修改如下
@JsonSerialize(using = CustomDateSerializer.class)
private Date birthday;
2、使用内置的日期格式化工具
同样是全局设置json响应的日期格式,但此方法可以和@JsonFormat共存,也就是说可以全局设置一个格式,特定的需求可以使用注解设置。
配置spring_mvc文件
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8value>
list>
property>
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyyMMddHHmmss" />
bean>
property>
bean>
property>
bean>
mvc:message-converters>
mvc:annotation-driven>