前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >放弃fastjson,拥抱Jackson

放弃fastjson,拥抱Jackson

作者头像
大数据技术与应用实战
发布于 2020-09-15 06:32:06
发布于 2020-09-15 06:32:06
1.5K00
代码可运行
举报
运行总次数:0
代码可运行
  • json object操作
  • 序列化操作
  • 反序列化
  • 日期类型反序列化
  • 自定义反序列化
  • 枚举类型反序列化

背景

最近由于阿里的fastjson频繁爆出安全漏洞,为了避免后续升级上线的烦恼,决定弃用fastjson,使用Jackson,把现有项目中的fastjson都换成了Jackson,由于很多写法上有些不同,所以在这里把这些改过的东西做一下笔记。

常用操作

首先引入相关的pom

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <properties>
        <jackson.version>2.11.0</jackson.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
    </dependencies>

json object操作

当我们需要一个json对象和json数组的时候,我们可以使用下面的方法来构造ObjectNode和ArrayNode,类似fastjson中的JSONObject和JSONArray。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
 public void testJsonObject(){
  ObjectMapper mapper = new ObjectMapper();
  ObjectNode json = mapper.createObjectNode();
  json.put("name", "Tom");
  json.put("age", 1);
  System.out.println(json);

  ArrayNode jsonNodes = mapper.createArrayNode();
  jsonNodes.add(json);
  System.out.println(jsonNodes);
 }

序列化操作

序列化操作就是将Java对象转化成json,简单的语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
 public void testSerialize() throws JsonProcessingException{
  User user = new User();
  user.setAge(1);
  user.setName("zhangsan");
  user.setGender(GENDER.MALE);
  user.setBirthday(new Date());
  ObjectMapper mapper = new ObjectMapper();
  String s = mapper.writeValueAsString(user);
  System.out.println(s);
 }

普通的String和int类型没有什么疑问,我们这里涉及了两个特殊类型,一个是Date,还有一个是枚举。 日期类型我们是通过注解@JsonFormat对日期类型做了格式化,可以控制输出的日期格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;

枚举类型,我们通过注解@JsonValue来控制输出哪个字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      @JsonValue
  public String getName(){
   return name;
  }

反序列化

反序列化就是将json转化成Java对象,语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
 public void testDeSerialize() throws JsonProcessingException{
  String json = "{\"name\":\"zhangsan\",\"age\":10}";
  ObjectMapper mapper = new ObjectMapper();
  User user = mapper.readValue(json, User.class);
  System.out.println(user);
 }

日期类型反序列化

对于Date类型,目前支持以下的格式:

  • long类型的时间戳
  • 通过@JsonFormat 注解指定类型格式:yyyy-MM-dd HH:mm:ss
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Test
 public void testDeSerializeDate() throws JsonProcessingException{
  String json = "{\"name\":\"zhangsan\",\"age\":10,\"birthday\":1592800446397}";
  ObjectMapper mapper = new ObjectMapper();
  User user = mapper.readValue(json, User.class);
  System.out.println(user);

  String json1 = "{\"name\":\"zhangsan\",\"age\":10,\"birthday\":\"2020-01-01 12:13:14\"}";
  User user1 = mapper.readValue(json1, User.class);
  System.out.println(user1);

 }

自定义反序列化

有时候系统提供的反序列化方式不能满足我们的需求,我们可以自定义一些方法来满足我们个性化的需求,我们以一个日期为例,讲讲如何自定义反序列化。

首先我们在对应的字段上通过注解@JsonDeserialize来指定反序列化的类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@JsonDeserialize(using = CustomDeserializerDate.class)
    private Date birthday_custom;

自定义的序列化类继承抽象类StdDeserializer,此外我们还要添加一个无参构造方法,否则会报错。 在deserialize方法里我们实现反序列化的逻辑.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public static class CustomDeserializerDate extends StdDeserializer<Date>{

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    protected CustomDeserializerDate(Class<?> vc){
     super(vc);
    }

    //需要一个无参构造方法,否则会报错
    public CustomDeserializerDate(){
     this(null);
    }

    @Override
    public Date deserialize(
      JsonParser p,
      DeserializationContext ctxt) throws IOException{
     String date = p.getText();
     try {
      return sdf.parse(date);
     } catch (ParseException e){
      e.printStackTrace();
     }
     return null;
    }
   }

枚举类型反序列化

最后我们讲一下枚举类型的反序列化

如下代码所示,我们通过注解@JsonCreator来处理枚举反序列化,该方法接收一个int类型的参数,也就是枚举的value值,返回枚举类型GENDER。如果没找到,则返回null.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static enum GENDER{
  MALE("男", 1), FEMALE("女", 0);
  private String name;
  private int value;

  @JsonCreator
  public static GENDER getGenderById(int value){
   for (GENDER c: GENDER.values()){
    if (c.getValue() == value){
     return c;
    }
   }
   return null;
  }
  
  ..........
   }

完整代码请参考:https://github.com/zhangjun0x01/bigdata-examples/blob/master/java/src/main/java/json/JacksonTest.java

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术与应用实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jackson 使用
老版本的 Jackson 使用的包名为 org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson。
acc8226
2022/05/17
1.9K0
放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)
在上篇《经过多方调研,最终还是决定禁用FastJson!》中,讲了FastJson的基本使用以及存在的不确定性问题,所以最终决定在项目中放弃使用,进而选择市面上比较主流,Spring Boot默认绑定的JSON类库:Jackson。
程序新视界
2021/03/02
4K0
Jackson详解
其中 jackson-databind内部依赖了jackson-annotations与ackson-core,故只导入jackson-databind即可
Java微观世界
2025/01/21
3060
Jackson详解
Jackson,最牛掰的 Java JSON 解析器
在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪。
沉默王二
2020/12/15
1.9K0
Jackson 常用注解
通过 @JacksonInject 注解可以在 Jackson 反序列化的时候为空值字段动态赋值,当反序列化的对应属性值不存在时,可通过该注解为其动态设置值。
BUG弄潮儿
2022/06/07
1.8K0
除了FastJson,你也应该了解一下Jackson(一)
在上月末的时候收到一条关于fastjson安全漏洞的消息,突然想到先前好像已经有好多次这样的事件了(在fastjson上面)。关于安全方面,虽然中枪的机率微小,但是在这个信息越来越复杂的时代,安全性也变得越来越重要,就像DevSecOps的诞生,在软件交付的整个价值流中我们也需要注重安全这方面。当然我们现在不谈关于FastJson的优劣,因为我们本文的目标是让大家了解和掌握Jackson。
东溪陈姓少年
2020/08/06
1.3K0
Java中的JSON序列化和反序列化
JSON 起源于 1999 年的 JS 语言规范 ECMA262 的一个子集,后来 2003 年作为一个数据格式ECMA404(404???)发布。 2006 年,作为 rfc4627 发布,这时规范增加到 18 页,去掉没用的部分,十页不到。
鱼找水需要时间
2023/03/23
2.4K0
Java中的JSON序列化和反序列化
Java几种常用JSON库性能比较
本文通过JMH(即JavaMicrobenchmarkHarness,基于方法层面的基准测试,精网络
Java架构师必看
2021/07/15
4.9K0
Java几种常用JSON库性能比较
Jackson - LocalDateTime序列化探索
在Java开发中,涉及Json序列化及反序列化的情况有很多,最常见的就是SpringBoot/SpringCloud项目中HTTP/Rest接口的传参。其中经常会涉及到时间类型LocalDateTime的序列化和反序列化,这里经常会因为序列化失败,导致接外部接口调用或Feign调用失败。
夹胡碰
2021/06/17
3.9K0
Jackson - LocalDateTime序列化探索
除了FastJson,你也应该了解一下Jackson(二)
上一篇文章介绍了Jackson中的映射器ObjectMapper,以及如何使用它来实现Json与Java对象之间的序列化和反序列化,最后介绍了Jackson中一些序列化/反序列化的高级特性。而本文将会介绍Jackson中的一些常用的(序列化/反序列化)注解,并且通过示例来演示如何使用这些注解,从而来提高我们在处理Json上的工作效率。
东溪陈姓少年
2020/08/06
1.7K0
Jackson 解析 JSON 详细教程
JSON 对于开发者并不陌生,如今的 WEB 服务、移动应用、甚至物联网大多都是以 JSON 作为数据交换的格式。学习 JSON 格式的操作工具对开发者来说是必不可少的。这篇文章将介绍如何使用 Jackson 开源工具库对 JSON 进行常见操作。
未读代码
2022/11/21
3.2K0
Jackson 解析 JSON 详细教程
Java-json序列化和反序列化
java开发中经常会遇到json的序列化与反序列化,常用的json序列化工具有阿里的Fastjson、spring mvc内置的Jackson、还有就是我们接下来要说的谷歌的Gson。
Vincent-yuan
2021/04/01
4.9K0
重学springboot系列之JSON处理工具类
fastjson为人诟病的问题:虽然fastjson速度上有一定的优势,但是其为了追求速度,很大程度放弃了JSON的规范性。因此还时不时的在有些版本中暴露安全问题。大家如果有机会去看一下fastjson的github代码,其代码质量不是很高。所以用不用fastjson在国内软件界还是有争议的,在国外基本没人用。
大忽悠爱学习
2021/12/07
2.6K0
重学springboot系列之JSON处理工具类
Jackson反序列化不可变类
如下ImmutableUser类属性都被final修饰,只有全参构造器,没有setter方法,它的实例一经创建就不可变。如何使用Jackson反序列化它呢?
科技新语
2024/11/13
1660
Jackson反序列化不可变类
使用com.fasterxml.jackson.annotation的注解
是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
用户4396583
2024/08/01
7660
经过性能对比,我发现温少的FastJson真牛。
JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。
Spark学习技巧
2019/06/18
6.9K0
经过性能对比,我发现温少的FastJson真牛。
Jackson快速入门
Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多。
乐百川
2019/05/29
3.3K0
Jackson快速入门
都是微服务的天下了,还有不知道 JSON 的程序员吗?
  JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
Demo_Null
2020/09/28
4.7K0
都是微服务的天下了,还有不知道 JSON 的程序员吗?
springmvc学习笔记--json--返回json的日期格式问题
(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加jackson-mapper-asl 1 <dependency> 2 <groupId>org.codehaus.jackson</groupId> 3 <artifactId>jackson-mapper-asl</artifactId> 4 <version>$
Ryan-Miao
2018/03/13
2.9K0
springmvc学习笔记--json--返回json的日期格式问题
用了几年的 Fastjson,我最终替换成了Jackson!
作者:larva-zhh 来源:www.cnblogs.com/larva-zhh/p/11544317.html
Java技术栈
2021/05/11
5.8K0
相关推荐
Jackson 使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验