Jackson使用指南

Jackson使用指南

本文主要介绍jackson的基本使用方法


1.Jackson简单序列化与反序列化

  1. 首先创建一个简单的类
@Setter
@Getter
public class Student {

    private String name;

    private int age;
}
  1. 创建一个jackson的objectMapper对象用来序列化
import com.fasterxml.jackson.databind.ObjectMapper;
public static void main(String[] args) {
    ObjectMapper objectMapper = new ObjectMapper();
}
  1. 将一个student对象序列化为字符串
public static void main(String[] args) throws IOException {
    ObjectMapper objectMapper=new ObjectMapper();
    
    Student student=new Student();
    student.setName("abc");
    student.setAge(18);
    
    String s = objectMapper.writeValueAsString(student);
    System.out.println(s);
}

得到以下输出:

{"name":"abc","age":18}
  1. 将字符串转换为student对象
public static void main(String[] args) throws IOException {
    ObjectMapper objectMapper=new ObjectMapper();

    String s = "{\"name\":\"abc\",\"age\":18}";
    Student student = objectMapper.readValue(s, Student.class);
    System.out.println(student);
}

得到输出:

Student(name=abc, age=18)

2.序列化和反序列化列表对象

  1. 创建一个包含列表的类
@Setter
@Getter
public class ClassRoom {

    List<Student> studentList;
}
  1. 序列化
public static void main(String[] args) throws IOException{
    List<Student> list=new ArrayList<>();
    for(int i = 0; i < 3; i++) {
        Student student=new Student();
        student.setName("name"+i);
        student.setAge(i);
        list.add(student);
    }

    ClassRoom classRoom=new ClassRoom();

    classRoom.setStudentList(list);

    ObjectMapper objectMapper=new ObjectMapper();
    String s=objectMapper.writeValueAsString(classRoom);
    
    System.out.println(s);
}

得到输出:

{"studentList":[{"name":"name0","age":0},{"name":"name1","age":1},{"name":"name2","age":2}]}

反序列化同上

  1. 另外还可以将字符串和列表进行转换
String s = objectMapper.writeValueAsString(list);

List<Student> list1 = objectMapper.readValue(s, new TypeReference<List<Student>>(){});

3.整数与enum之间的序列化和反序列化

  1. 先定义一个enum类型并添加在Student类中
public enum ScoreEnum {
    A,
    B,
    C;
}
@Getter
@Setter
public class Student {

    private String name;

    private int age;

    private ScoreEnum scoreEnum;
}
  1. 直接进行序列化
public static void main(String[] args) throws IOException {
    Student student = new Student();
    student.setName("abc");
    student.setScoreEnum(ScoreEnum.A);

    ObjectMapper objectMapper = new ObjectMapper();
    String s = objectMapper.writeValueAsString(student);

    System.out.println(s);
}

得到输出:

{"name":"abc","age":0,"scoreEnum":"A"}

可以发现默认是解析成字符串的
当我们需要解析的字符串是一个整数时

ObjectMapper objectMapper = new ObjectMapper();

String s = "{\"name\":\"abc\",\"age\":0,\"scoreEnum\":1}";
Student student = objectMapper.readValue(s, Student.class);

System.out.println(student);

得到输出:

Student(name=abc, age=0, scoreEnum=B)
  1. 将整数转换为enum
    显然jackson默认用的是enum的ordinal()来解析,如果我们希望自定义整数与enum的对应关系,就需要使用 @JsonCreator 注解
@AllArgsConstructor
public enum ScoreEnum {
    A(1),

    B(2),

    C(3);

    private int num;

    @JsonCreator
    public static ScoreEnum fromValue(int num) {
        for (ScoreEnum enumValue : values()) {
            if (enumValue.getNum() == num) {
                return enumValue;
            }
        }
        return null;
    }
    
    public int getNum() {
        return num;
    }
}

运行之前的代码得到:

Student(name=abc, age=0, scoreEnum=A)

4.将enum转换为整数
如果要将enum转换为整数而不是字符串也需要额外使用注解 @JsonValue

@AllArgsConstructor
public enum ScoreEnum {
    A(1),

    B(2),

    C(3);

    private int num;

    @JsonCreator
    public static ScoreEnum fromValue(int num) {
        for (ScoreEnum enumValue : values()) {
            if (enumValue.getNum() == num) {
                return enumValue;
            }
        }
        return null;
    }
    
    @JsonValue
    public int getNum() {
        return num;
    }
}

这样就完成了整数与enum的互转

4.不同名参数的转换

如果要将一个参数序列化或反序列化为不同名的结果,可以使用 @JsonProperty
将上面例子中的ClassRoom修改为如下所示

@Setter
@Getter
public class ClassRoom {
    @JsonProperty("newList")
    List<Student> studentList;
}

运行之前的例子,得到输出:

{"newList":[{"name":"name0","age":0},{"name":"name1","age":1},{"name":"name2","age":2}]}

5.ObjectMapper的一些配置

通过以下设置会在序列化和反序列化时忽略无法解析和为空的字段

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用Jackson库可以方便地进行JSON的序列化和反序列化操作。以下是使用Jackson的一些基本用法: 1. 添加Jackson依赖:在你的项目中,需要添加Jackson的依赖项。在`pom.xml`文件中,添加以下依赖项: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.4</version> </dependency> ``` 2. 序列化对象为JSON:使用`ObjectMapper`类可以将Java对象序列化为JSON字符串。例如,假设有一个名为`User`的Java类: ```java public class User { private String name; private int age; // 省略构造函数、getter和setter方法 @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 你可以使用以下代码将`User`对象序列化为JSON字符串: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class Main { public static void main(String[] args) throws Exception { User user = new User("John Doe", 30); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); System.out.println(json); } } ``` 3. 反序列化JSON为对象:使用`ObjectMapper`类可以将JSON字符串反序列化为Java对象。例如,假设有一个名为`User`的Java类: ```java public class User { private String name; private int age; // 省略构造函数、getter和setter方法 @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 你可以使用以下代码将JSON字符串反序列化为`User`对象: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class Main { public static void main(String[] args) throws Exception { String json = "{\"name\":\"John Doe\",\"age\":30}"; ObjectMapper objectMapper = new ObjectMapper(); User user = objectMapper.readValue(json, User.class); System.out.println(user); } } ``` 以上是使用Jackson库进行基本的JSON序列化和反序列化操作的示例。你可以根据需要使用更多的Jackson功能,例如处理日期、自定义序列化器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值