Jackson详解
来源:互联网 发布:打开app显示网络错误 编辑:程序博客网 时间:2024/06/07 04:53
一 jackson对象和字符串及其数组对象和字符串相互转换
1.maven引入Jackson包
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.4</version> </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<User> users = new ArrayList<User>(); users.add(user); users.add(user3); // Convert List<object> to JSON string String json3 = mapper.writeValueAsString(users); System.err.println(json3); // Convert Json string to List<Object> List<User> users3=mapper.readValue(json3, new TypeReference<List<User>>() { }); 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.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </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文件
<!-- MappingJackson2HttpMessageConverter处理responseBody 里面日期类型 xsi:schemaLocation引入版本必须大于等于3.1 --><mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </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>
- jackson详解
- jackson详解
- Jackson详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- Jackson 2开发详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- jackson annotations注解详解
- 等错误率EER
- Firefox 2015 最受国人欢迎的十大扩展
- MD5加密
- 今天做了一个小游戏 猜拳游戏 大家可以看看玩玩
- SELECT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'。请确保 SET 选项正确无误
- Jackson详解
- SharePreferenceUtils 工具类
- OJ 2515: 小明买蛋挞
- centos上安装python2.7.13
- RFC1341(MIME): 7 The Multipart Content-Type英译中
- SSM框架下事务配置注意事项
- OpenCV相机标定calibrateCamera坐标系详解
- subList的缺陷
- 移动端line-height偏上问题