美文网首页java
jackson中objectMapper的使用

jackson中objectMapper的使用

作者: 谁在烽烟彼岸 | 来源:发表于2019-04-16 16:10 被阅读47次

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
    ObjectMapper类是Jackson库的主要类。它称为ObjectMapper的原因是因为它将JSON映射到Java对象(反序列化),或将Java对象映射到JSON(序列化)。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。

    maven 安装

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.6</version>
    </dependency>
    
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.6</version>
    </dependency>
    
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.6</version>
    </dependency>
    

    Jackson ObjectMapper如何将JSON字段与Java字段匹配

    三种方式
    1.Jackson通过将JSON字段的名称与Java对象中的getter和setter方法相匹配,将JSON对象的字段映射到Java对象中的字段。Jackson删除了getter和setter方法名称的“get”和“set”部分,并将剩余名称的第一个字符转换为小写。
    2.Jackson还可以通过java反射进行匹配
    3.通过注解或者其它方式进行自定义的序列化和反序列化程序。

    转Java对象

    1. Read Object From JSON String
    ObjectMapper objectMapper = new ObjectMapper();
    String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
    Car car = objectMapper.readValue(carJson, Car.class);
    

    2.Read Object From JSON Reader

    ObjectMapper objectMapper = new ObjectMapper();
    String carJson =  "{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";
    Reader reader = new StringReader(carJson);
    Car car = objectMapper.readValue(reader, Car.class);
    

    3.Read Object From JSON File

    ObjectMapper objectMapper = new ObjectMapper();
    File file = new File("data/car.json");
    Car car = objectMapper.readValue(file, Car.class);
    
    1. Read Object From JSON via URL
    ObjectMapper objectMapper = new ObjectMapper();
    URL url = new URL("file:data/car.json");
    Car car = objectMapper.readValue(url, Car.class);
    

    本例使用的是文件URL,也可使用一个HTTP URL(如:http://jenkov.com/some-data.json ).

    1. Read Object From JSON InputStream
    ObjectMapper objectMapper = new ObjectMapper();
    InputStream input = new FileInputStream("data/car.json");
    Car car = objectMapper.readValue(input, Car.class);
    

    6.Read Object From JSON Byte Array

    ObjectMapper objectMapper = new ObjectMapper();
    String carJson =  "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
    byte[] bytes = carJson.getBytes("UTF-8");
    Car car = objectMapper.readValue(bytes, Car.class);
    

    7.Read Object Array From JSON Array String

    String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
    ObjectMapper objectMapper = new ObjectMapper();
    Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);
    
    1. Read Object List From JSON Array String
    String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
    ObjectMapper objectMapper = new ObjectMapper();
    List<Car> cars1 = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});
    
    1. Read Map from JSON String
    String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,
        new TypeReference<Map<String,Object>>(){});
    

    转Json

    ObjectMapper write有三个方法

    • writeValue()
    • writeValueAsString()
    • writeValueAsBytes()
    ObjectMapper objectMapper = new ObjectMapper();
    Car car = new Car();
    car.brand = "BMW";
    car.doors = 4;
    //写到文件中
    objectMapper.writeValue( new FileOutputStream("data/output-2.json"), car);
    //写到字符串中
    String json = objectMapper.writeValueAsString(car);
    

    使用Jackson ObjectMapper读取和写入其他数据格式

    使用Jackson可以读取和写入除JSON之外的其他数据格式:

    • CBOR
    • MessagePack
    • YAML

    其中这些数据格式比JSON更紧凑,因此在存储时占用的空间更少,并且读取和写入速度比JSON更快。在以下部分中,我将向您展示如何使用Jackson读取和写入其中一些数据格式。

    使用Jackson ObjectMapper读写CBOR

    CBOR是一种二进制数据格式,它与JSON兼容,但比JSON更紧凑,因此读写速度更快。Jackson ObjectMapper可以像读写JSON一样读写CBOR。为了使用Jackson读取和写入CBOR,您需要为项目添加额外的Maven依赖项。介绍了添加Jackson CBOR Maven依赖关系:

    import com.fasterxml.jackson.core.JsonProcessingException; 
    import com.fasterxml.jackson.databind.ObjectMapper; 
    import com.fasterxml.jackson.dataformat.cbor.CBORFactory; 
    
    public class CborJacksonExample {
        public static void main(String[] args) {
            ObjectMapper objectMapper = new ObjectMapper(new CBORFactory());
            Employee employee = new Employee("John Doe", "john@doe.com");
            byte[] cborBytes = null;
            try {
                cborBytes = objectMapper.writeValueAsBytes(employee);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                // normally, rethrow exception here - or don't catch it at all.
            }
            try {
                Employee employee2 = objectMapper.readValue(cborBytes, Employee.class);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    使用Jackson ObjectMapper读取和编写MessagePack

    MessagePack是一种文本数据格式,与JSON兼容,但更紧凑,因此读写速度更快。Jackson ObjectMapper可以像读写JSON一样读写MessagePack。为了使用Jackson读写MessagePack,您需要为项目添加额外的Maven依赖项:

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.msgpack.jackson.dataformat.MessagePackFactory;
    
    import java.io.IOException;
    
    public class MessagePackJacksonExample {
        public static void main(String[] args) {
            ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
    
            Employee employee = new Employee("John Doe", "john@doe.com");
    
            byte[] messagePackBytes = null;
            try {
                messagePackBytes = objectMapper.writeValueAsBytes(employee);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                // normally, rethrow exception here - or don't catch it at all.
            }
    
            try {
                Employee employee2 = objectMapper.readValue(messagePackBytes, Employee.class);
                System.out.println("messagePackBytes = " + messagePackBytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    使用Jackson ObjectMapper读取和编写YAML

    YAML是一种文本数据格式,类似于JSON,但使用不同的语法。Jackson ObjectMapper可以像读写JSON一样读写YAML。为了使用Jackson读取和写入YAML,您需要为项目添加额外的Maven依赖项:

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
    
    import java.io.IOException;
    
    public class YamlJacksonExample {
    
        public static void main(String[] args) {
            ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    
            Employee employee = new Employee("John Doe", "john@doe.com");
    
            String yamlString = null;
            try {
                yamlString = objectMapper.writeValueAsString(employee);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                // normally, rethrow exception here - or don't catch it at all.
            }
    
            try {
                Employee employee2 = objectMapper.readValue(yamlString, Employee.class);
    
                System.out.println("Done");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    ObjectMapper的设置

    ObjectMapper objectMapper = new ObjectMapper();
    //去掉默认的时间戳格式     
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //设置为东八区
    objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    // 设置输入:禁止把POJO中值为null的字段映射到json字符串中
    objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
     //空值不序列化
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    //反序列化时,属性不存在的兼容处理
    objectMapper.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    //序列化时,日期的统一格式
    objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    //序列化日期时以timestamps输出,默认true
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //序列化枚举是以toString()来输出,默认false,即默认以name()来输出
    objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);
    //序列化枚举是以ordinal()来输出,默认false
    objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX,false);
    //类为空时,不要抛异常
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    //反序列化时,遇到未知属性时是否引起结果失败
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     //单引号处理
    objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    //解析器支持解析结束符
    objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    

    自定义解析器

    ObjectMapper 可以通过自定义解析器来定义解析方法
    以下是自定义的反序列化的方法

    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import com.fasterxml.jackson.databind.JsonNode;
    import org.springframework.data.geo.Point;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Point_Fastjson_Deserialize extends JsonDeserializer<Point> {
    
        @Override
        public Point deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            JsonNode node = jsonParser.getCodec().readTree(jsonParser);
            Iterator<JsonNode> iterator = node.get("coordinates").elements();
            List<Double> list = new ArrayList<>();
            while (iterator.hasNext()) {
                list.add(iterator.next().asDouble());
            }
            return new Point(list.get(0), list.get(1));
        }
    }
    
    

    注册到objectMapper中

    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(Point.class, new Point_Fastjson_Deserialize());
    objectMapper.registerModule(module);
    

    相关文章

      网友评论

        本文标题:jackson中objectMapper的使用

        本文链接:https://www.haomeiwen.com/subject/corhwqtx.html