Bootstrap

浅谈Java库之Jackson

一、Jackson的介绍

        Jackson是Java领域中一个非常流行的库,用于处理JSON数据。它提供了数据绑定(序列化和反序列化)功能,可以将Java对象转换成JSON格式的数据,也可以将JSON数据转换成Java对象。Jackson由FasterXML公司开发,是许多Java应用中处理JSON的首选库之一。

二、Jackson库特点

1、性能:Jackson以其出色的性能而闻名,特别是在处理大型数据结构时。

2、灵活性:支持各种数据类型,包括复杂的Java对象。

3、扩展性:提供了丰富的扩展API,允许自定义序列化和反序列化行为。

4、兼容性:与Spring框架等其他Java技术栈良好集成。

5、注解:提供了一套注解,用于控制序列化和反序列化的行为。

三、Jackson库简单使用

要在Java项目中使用Jackson,你首先需要添加Jackson库的依赖。以下是Maven依赖示例:

<!-- Jackson核心库 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

请根据需要替换为最新版本号。

序列化(将Java对象转换为JSON)
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();

        try {
            // 创建一个Java对象
            MyObject obj = new MyObject();
            obj.setName("Kimi");
            obj.setAge(30);

            // 将Java对象序列化为JSON字符串
            String jsonString = mapper.writeValueAsString(obj);
            System.out.println(jsonString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyObject {
    private String name;
    private int age;

    // getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

反序列化(将JSON转换为Java对象)
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();

        try {
            // JSON字符串
            String jsonString = "{\"name\":\"Kimi\",\"age\":30}";

            // 将JSON字符串反序列化为Java对象
            MyObject obj = mapper.readValue(jsonString, MyObject.class);
            System.out.println(obj.getName());
            System.out.println(obj.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyObject {
    private String name;
    private int age;

    // getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

高级特性

Jackson还提供了许多高级特性,如:

  • 注解:通过注解控制序列化和反序列化的行为,例如@JsonProperty@JsonIgnore等。
  • 模块:提供了额外的功能模块,如数据类型模块(处理Java 8日期/时间API)、参数化类型模块等。
  • 流式API:提供了流式处理API,用于处理大型JSON数据,减少内存消耗。

四、Jackson库详细使用

1. 自定义模块

自定义一个Jackson模块,用于添加自定义的序列化器和反序列化器:

import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class MyModule extends SimpleModule {
    private static final long serialVersionUID = 1L;

    public MyModule() {
        super("myModule", VersionUtil.parseVersion("1.0.0", "com.pearl", "jackson-datatype-my"));
    }

    @Override
    public void setupModule(SetupContext context) {
        super.setupModule(context);
        SimpleDeserializers desers = new SimpleDeserializers();
        desers.addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET);
        context.addDeserializers(desers);
        SimpleSerializers sers = new SimpleSerializers();
        sers.addSerializer(ZoneOffset.class, new ToStringSerializer(ZoneOffset.class));
        context.addSerializers(sers);
    }
}

注册模块到ObjectMapper

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.Version;

ObjectMapper objectMapper = new ObjectMapper();
Version version = VersionUtil.parseVersion("1.0.0", "com.pearl", "jackson-datatype-my");
SimpleModule myModule = new SimpleModule("myModule", version);
myModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
myModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
objectMapper.registerModule(myModule);

2. 流式API

使用Jackson的流式API来处理JSON数据:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;

public class MyObjectCodec extends com.fasterxml.jackson.core.ObjectCodec {
    // 实现自定义的编解码逻辑
}

public class JacksonStreamExample {
    public static void main(String[] args) throws IOException {
        JsonFactory factory = new JsonFactory();
        JsonParser jsonParser = factory.createParser(new File("person.json"));
        jsonParser.setCodec(new MyObjectCodec());
        Person person = jsonParser.readValueAs(Person.class);
        System.out.println(person);
        jsonParser.close();
    }
}

3. 注解定制序列化和反序列化

使用Jackson注解来定制序列化和反序列化过程:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;

class User {
    @JsonProperty("full_name")
    private String name;
    private int age;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private Date birthDate;

    // getters and setters
}

String jsonString = objectMapper.writeValueAsString(user);
User deserializedUser = objectMapper.readValue(jsonString, User.class);

;