Jackson中使用ObjectMapper进行对象转JSON的示例

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class ObjectMapperWriteDemo {

    /**
     * Write JSON From Objects
     * 从对象写入 JSON 文件
     * 可用于使用提供的输出流(使用编码JsonEncoding.UTF8 )将任何 Java 值序列化为 JSON 输出的方法。
     * 注意:方法在这里没有显式关闭底层流;
     * 但是,此映射器使用的JsonFactory可能会根据其设置选择关闭流(默认情况下,当我们构造的JsonGenerator关闭时,它将尝试关闭它)。
     *
     * @throws IOException
     */
    @Test
    public void test1() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();

        Car car = new Car();
        car.setBrand("BMW");
        car.setDoors(4);

        objectMapper.writeValue(new FileOutputStream("src/data/output-2.json"), car);
    }

    /**
     * 可用于将任何 Java 值序列化为字符串的方法。
     * 功能上等同于使用StringWriter调用writeValue(Writer, Object)并构造 String,但效率更高。
     *
     * @throws JsonProcessingException
     */
    @Test
    public void test2() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        Car car = new Car();
        car.setBrand("BMW");
        car.setDoors(4);

        String json = objectMapper.writeValueAsString(car);
        System.out.println(json);
    }

    /**
     * 可用于将任何 Java 值序列化为字节数组的方法。
     * 在功能上等同于使用ByteArrayOutputStream调用writeValue(Writer, Object)并获取字节,但效率更高。
     * 使用的编码将是 UTF-8。
     *
     * @throws JsonProcessingException
     */
    @Test
    public void test3() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        Car car = new Car();
        car.setBrand("BMW");
        car.setDoors(4);

        byte[] json = objectMapper.writeValueAsBytes(car);
        System.out.println(Arrays.toString(json));
    }

    /**
     * 可用于将任何 Java 值序列化为字节数组的方法。
     * 在功能上等同于使用ByteArrayOutputStream调用writeValue(Writer, Object)并获取字节,但效率更高。
     * 使用的编码将是 UTF-8。
     *
     * @throws JsonProcessingException
     */
    @Test
    public void test4() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        SimpleModule module =
                new SimpleModule("CarSerializer", new Version(2, 1, 3, null, null, null));
        module.addSerializer(Car.class, new StdSerializer<Car>(Car.class) {

            @Override
            public void serialize(Car car, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeStartObject();
                jsonGenerator.writeStringField("producer", car.getBrand());
                jsonGenerator.writeNumberField("doorCount", car.getDoors());
                jsonGenerator.writeEndObject();
            }
        });

        objectMapper.registerModule(module);

        Car car = new Car();
        car.setBrand("Mercedes");
        car.setDoors(5);

        String carJson = objectMapper.writeValueAsString(car);
        System.out.println(carJson);
    }
}
posted @ 2021-10-08 15:45  xl4ng  阅读(603)  评论(0编辑  收藏  举报