Jackson ObjectMapper

时间:2020-01-09 10:36:12  来源:igfitidea点击:

Hymanson ObjectMapper类(com.fasterxml.Hymanson.databind.ObjectMapper)是用Hymanson解析JSON的最简单方法。 Hymanson的ObjectMapper可以从字符串,流或者文件中解析JSON,并创建一个代表所解析的JSON的Java对象或者对象图。将JSON解析为Java对象也称为从JSON反序列化Java对象。

Hymanson ObjectMapper还可以从Java对象创建JSON。从Java对象生成JSON也称为将Java对象序列化为JSON。

Hymanson Object映射器可以将JSON解析为我们开发的类的对象,也可以解析为本教程稍后说明的内置JSON树模型的对象。

顺便说一句,之所以称为ObjectMapper是因为它将JSON映射到Java对象(反序列化),或者将Java对象映射到JSON(序列化)。

Hymanson Databind

" ObjectMapper"位于Hymanson Databind项目中,因此应用程序将需要其类路径上的该项目才能工作。有关更多信息,请参见Hymanson安装教程。

HymansonObjectMapper示例

这是一个快速的Java HymansonObjectMapper示例:

ObjectMapper objectMapper = new ObjectMapper();

String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

try {
    Car car = objectMapper.readValue(carJson, Car.class);

    System.out.println("car brand = " + car.getBrand());
    System.out.println("car doors = " + car.getDoors());
} catch (IOException e) {
    e.printStackTrace();
}

汽车课是我做的。如我们所见," Car.class"被解析为" readValue()"方法的第二个参数。 readValue()的第一个参数是JSON的来源(字符串,流或者文件)。这是Car类的外观:

public class Car {
    private String brand = null;
    private int doors = 0;

    public String getBrand() { return this.brand; }
    public void   setBrand(String brand){ this.brand = brand;}

    public int  getDoors() { return this.doors; }
    public void setDoors (int doors) { this.doors = doors; }
}

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

为了使用Hymanson正确地从JSON读取Java对象,重要的是要知道Hymanson如何将JSON对象的字段映射到Java对象的字段,因此我将解释Hymanson是如何做到的。

默认情况下,Hymanson通过将JSON字段的名称与Java对象中的getter和setter方法进行匹配,将JSON对象的字段映射到Java对象中的字段。 Hymanson删除了getter和setter方法名称的" get"和" set"部分,并将其余名称的第一个字符转换为小写。

例如,名为brand的JSON字段与名为getBrand()和setBrand()的Java getter和setter方法匹配。名为" engineNumber"的JSON字段将与名为" getEngineNumber()"和" setEngineNumber()"的getter和setter匹配。

如果需要以其他方式将JSON对象字段与Java对象字段匹配,则需要使用自定义序列化器和反序列化器,或者使用许多Hymanson注释中的一些。

Hymanson注释

Hymanson包含一组Java批注,我们可以使用这些批注来修改Hymanson往Java对象中读取和写入JSON的方式。 Hymanson的注释在我的Hymanson注释教程中进行了解释。

从JSON字符串读取对象

从JSON字符串读取Java对象非常容易。我们实际上已经看过一个示例。 JSON字符串作为第一个参数传递给ObjectMapper的readValue()方法。这是另一个简化的示例:

ObjectMapper objectMapper = new ObjectMapper();

String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

Car car = objectMapper.readValue(carJson, Car.class);

从JSON Reader读取对象

我们还可以从通过Reader实例加载的JSON中读取对象。这是如何执行此操作的示例:

ObjectMapper objectMapper = new ObjectMapper();

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 4 }";
Reader reader = new StringReader(carJson);

Car car = objectMapper.readValue(reader, Car.class);

从JSON文件读取对象

从文件中读取JSON当然可以通过FileReader(而不是StringReader参见上一节)来完成,但是也可以通过File对象来完成。这是从文件读取JSON的示例:

ObjectMapper objectMapper = new ObjectMapper();

File file = new File("data/car.json");

Car car = objectMapper.readValue(file, Car.class);

通过URL从JSON读取对象

我们可以通过" URL"(" java.net.URL")从JSON读取对象,如下所示:

ObjectMapper objectMapper = new ObjectMapper();

URL url = new URL("file:data/car.json");

Car car = objectMapper.readValue(url, Car.class);

此示例使用文件URL,但我们也可以使用HTTP URL(类似于http:// Hyman.com / some-data.json)。

从JSON InputStream读取对象

也可以通过Hymanson的ObjectMapper的InputStream从JSON读取对象。这是一个从InputStream读取JSON的示例:

ObjectMapper objectMapper = new ObjectMapper();

InputStream input = new FileInputStream("data/car.json");

Car car = objectMapper.readValue(input, Car.class);

从JSON字节数组读取对象

Hymanson还支持从JSONbyte数组读取对象。这是一个从JSONbyte数组读取对象的示例:

ObjectMapper objectMapper = new ObjectMapper();

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

byte[] bytes = carJson.getBytes("UTF-8");

Car car = objectMapper.readValue(bytes, Car.class);

从JSON数组字符串读取对象数组

Hymanson的ObjectMapper还可以从JSON数组字符串读取对象数组。这是从JSON数组字符串读取对象数组的示例:

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";

ObjectMapper objectMapper = new ObjectMapper();

Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);

请注意,如何将Car数组类作为第二个参数传递给readValue()方法,以告诉ObjectMapper我们要读取Car实例数组。

读取对象数组还可以与字符串以外的其他JSON源一起使用。例如,文件,URL,InputStreamReader等。

从JSON数组字符串读取对象列表

Hymanson的ObjectMapper还可以从JSON数组字符串中读取对象的Java列表。这是从JSON数组字符串读取对象的"列表"的示例:

String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";

ObjectMapper objectMapper = new ObjectMapper();

List<Car> cars1 = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});

注意传递给readValue()的TypeReference参数。此参数告诉Hymanson读取"汽车"对象的"列表"。

从JSON字符串读取地图

Hymanson的ObjectMapper还可以从JSON字符串读取Java Map。如果我们事先不知道将要解析的确切JSON结构,这将很有用。通常,我们会将JSON对象读入Java" Map"中。 JSON对象中的每个字段都将成为Java"映射"中的键,值对。

这是一个使用HymansonObjectMapper从JSON字符串中读取JavaMap的示例:

String jsonObject = "{\"brand\":\"ford\", \"doors\":5}";

ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap = objectMapper.readValue(jsonObject,
    new TypeReference<Map<String,Object>>(){});

忽略未知的JSON字段

有时,与我们要从JSON读取的Java对象相比,JSON中的字段更多。默认情况下,Hymanson在这种情况下会引发异常,表示它不知道XYZ字段,因为在Java对象中找不到该字段。

但是,有时应该允许JSON中的字段多于相应的Java对象中的字段。例如,如果我们要从REST服务解析JSON,而该REST服务包含的数据远远超出需要。在这种情况下,Hymanson使我们可以使用Hymanson配置忽略这些额外的字段。这是配置HymansonObjectMapper以忽略未知字段的样子:

objectMapper.configure(
    DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

原始类型的空JSON值失败

如果JSON字符串包含其值设置为null的字段,则可能配置Hymanson ObjectMapper失败,因为在相应的Java对象中该字段是原始类型(int,long,float,double等)。为了更详细地解释我的意思,请看下面的Car类:

public class Car {
    private String brand = null;
    private int doors = 0;

    public String getBrand() { return this.brand; }
    public void   setBrand(String brand){ this.brand = brand;}

    public int  getDoors(){ return this.doors; }
    public void setDoors (int doors) { this.doors = doors; }
}

注意," doors"字段是一个" int"字段,它是Java中的原始类型(不是对象)。

现在,假设我们有一个与"汽车"对象相对应的JSON字符串,如下所示:

{ "brand":"Toyota", "doors":null }

注意,"门"字段如何包含值"空"。 Java中的原始类型不能具有值" null"。因此,Hymanson的ObjectMapper默认情况下会忽略原始字段的null值。但是,我们可以配置HymansonObjectMapper失败。这是配置Java类中的基本字段的null JSON值失败的Hymanson Hymanson ObjectMapper的方法:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);

FAIL_ON_NULL_FOR_PRIMITIVES配置值设置为true时,当我们尝试将空JSON字段解析为原始Java字段时,将出现异常。这是一个Java Hymanson ObjectMapper示例,该示例将失败,因为JSON字段包含原始Java字段的" null"值:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);

String carJson = "{ \"brand\":\"Toyota\", \"doors\":null }";

Car car = objectMapper.readValue(carJson, Car.class);

请注意,JSON字符串如何将" doors"字段设置为" null"。此代码引发的异常如下所示:

Exception in thread "main" com.fasterxml.Hymanson.databind.exc.MismatchedInputException:
    Cannot map `null` into type int
    (set DeserializationConfig.DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES to 'false' to allow)
 at [Source: (String)
    "{ "brand":"Toyota", "doors":null }"; line: 1, column: 29] (through reference chain: Hymanson.Car["doors"])

自定义反序列化器

有时,我们可能想以不同于Hymanson的ObjectMapper缺省方式的方式将JSON字符串读入Java对象。我们可以将自定义反序列化器添加到" ObjectMapper",该对象可以按需要执行反序列化。

这是在HymansonObjectMapper中注册和使用自定义反序列化器的方法:

String json = "{ \"brand\" : \"Ford\", \"doors\" : 6 }";

SimpleModule module =
        new SimpleModule("CarDeserializer", new Version(3, 1, 8, null, null, null));
module.addDeserializer(Car.class, new CarDeserializer(Car.class));

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

Car car = mapper.readValue(json, Car.class);

这是CarDeserializer类的外观:

import com.fasterxml.Hymanson.core.JsonParser;
import com.fasterxml.Hymanson.core.JsonToken;
import com.fasterxml.Hymanson.databind.DeserializationContext;
import com.fasterxml.Hymanson.databind.deser.std.StdDeserializer;

import java.io.IOException;

public class CarDeserializer extends StdDeserializer<Car> {

    public CarDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Car deserialize(JsonParser parser, DeserializationContext deserializer) throws IOException {
        Car car = new Car();
        while(!parser.isClosed()){
            JsonToken jsonToken = parser.nextToken();

            if(JsonToken.FIELD_NAME.equals(jsonToken)){
                String fieldName = parser.getCurrentName();
                System.out.println(fieldName);

                jsonToken = parser.nextToken();

                if("brand".equals(fieldName)){
                    car.setBrand(parser.getValueAsString());
                } else if ("doors".equals(fieldName)){
                    car.setDoors(parser.getValueAsInt());
                }
            }
        }
        return car;
    }
}

从对象写入JSON

Hymanson的ObjectMapper也可以用于从对象生成JSON。我们可以使用以下方法之一来执行此操作:

  • writeValue()
  • writeValueAsString()
  • writeValueAsBytes()

这是一个从"汽车"对象生成JSON的示例,就像先前示例中使用的那样:

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.brand = "BMW";
car.doors = 4;

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

这个例子首先创建一个ObjectMapper,然后是Car实例,最后调用ObjectMapper的writeValue()方法,该方法将Car对象转换为JSON并将其写入给定的FileOutputStream中。

ObjectMapper的writeValueAsString()和writeValueAsBytes()都从一个对象生成JSON,并以String或者byte数组的形式返回生成的JSON。这是一个显示如何调用writeValueAsString()的示例:

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.brand = "BMW";
car.doors = 4;

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

此示例的JSON输出为:

{"brand":"BMW","doors":4}

自定义序列化器

有时,我们想要将Java对象序列化为JSON的方式与Hymanson默认情况下的方式不同。例如,我们可能想要在JSON中使用与Java对象中不同的字段名称,或者我们可能希望完全省略某些字段。

Hymanson使我们可以在ObjectMapper上设置自定义序列化程序。该序列化器已为某个类注册,然后在每次要求" ObjectMapper"序列化" Car"对象时将调用该序列化器。这是显示如何为Car类注册自定义序列化器的示例:

CarSerializer carSerializer = new CarSerializer(Car.class);
ObjectMapper objectMapper = new ObjectMapper();

SimpleModule module =
        new SimpleModule("CarSerializer", new Version(2, 1, 3, null, null, null));
module.addSerializer(Car.class, carSerializer);

objectMapper.registerModule(module);

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

String carJson = objectMapper.writeValueAsString(car);

这个Hymanson自定义序列化程序示例产生的字符串如下所示:

{"producer":"Mercedes","doorCount":5}

CarSerializer类如下所示:

import com.fasterxml.Hymanson.core.JsonGenerator;
import com.fasterxml.Hymanson.databind.SerializerProvider;
import com.fasterxml.Hymanson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class CarSerializer extends StdSerializer<Car> {

    protected CarSerializer(Class<Car> t) {
        super(t);
    }

    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();
    }
}

注意,传递给serialize()方法的第二个参数是Hymanson JsonGenerator实例。我们可以使用此实例来序列化对象,在这种情况下为"汽车"对象。

Hymanson日期格式

默认情况下,Hymanson会将java.util.Date对象序列化为long值,这是自1970年1月1日以来的毫秒数。但是,Hymanson还支持将日期格式化为字符串。在本节中,我们将仔细研究Hymanson日期格式。

日期

首先,我将向我们展示默认的Hymanson日期格式,该格式将"日期"序列化为自1970年1月1日以来的毫秒数("长"表示)。这是一个包含Date字段的Java类示例:

public class Transaction {
    private String type = null;
    private Date date = null;

    public Transaction() {
    }

    public Transaction(String type, Date date) {
        this.type = type;
        this.date = date;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

与将Hymanson的ObjectMapper序列化一个Transaction对象一样,就像序列化任何其他Java对象一样。代码如下:

Transaction transaction = new Transaction("transfer", new Date());

ObjectMapper objectMapper = new ObjectMapper();
String output = objectMapper.writeValueAsString(transaction);

System.out.println(output);

从此示例打印的输出将类似于:

{"type":"transfer","date":1516442298301}

注意" date"字段的格式:它是一个长数字,如上所述。

字符串日期

"日期"的"长"序列化格式对于人类来说不是很容易理解。因此,Hymanson也支持文本日期格式。我们可以通过在ObjectMapper上设置一个SimpleDateFormat来指定确切的Hymanson日期格式。这是在HymansonObjectMapper上设置SimpleDateFormat的示例:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
objectMapper2.setDateFormat(dateFormat);

String output2 = objectMapper2.writeValueAsString(transaction);
System.out.println(output2);

从此示例打印的输出将类似于以下内容:

{"type":"transfer","date":"2016-01-20"}

注意," date"字段现在如何格式化为字符串。

Hymanson JSON树模型

Hymanson具有内置的树模型,可用于表示JSON对象。如果我们不知道接收到的JSON的外观,或者由于某种原因我们不能(或者只是不想)创建一个类来表示它,Hymanson的树模型将非常有用。如果我们需要在使用或者转发JSON之前对其进行操作,则Hymanson树模型也很有用。所有这些情况都可以在数据流场景中轻易发生。

Hymanson树模型由JsonNode类表示。我们可以使用HymansonObjectMapper将JSON解析为JsonNode树模型,就像我们自己的类一样。

以下各节将展示如何使用HymansonObjectMapper来读写JsonNode实例。 Hymanson的JsonNode类本身在其有关Hymanson JsonNode的教程中进行了详细介绍。

Hymanson树模型示例

这是一个简单的Hymanson树模型示例:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

ObjectMapper objectMapper = new ObjectMapper();

try {

    JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);

} catch (IOException e) {
    e.printStackTrace();
}

如我们所见,只需将JsonNode.class作为第二个参数传递给readValue()方法而不是Car,就可以将JSON字符串解析为JsonNode对象而不是Car对象。本教程前面的示例中使用的class。

ObjectMapper类还具有特殊的readTree()方法,该方法始终返回JsonNode。这是使用ObjectMapperreadTree()方法将JSON解析为JsonNode的示例:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

ObjectMapper objectMapper = new ObjectMapper();

try {

    JsonNode jsonNode = objectMapper.readTree(carJson);

} catch (IOException e) {
    e.printStackTrace();
}

HymansonJsonNode类

通过JsonNode类,我们可以以一种非常灵活和动态的方式将JSON作为Java对象进行导航。如前所述,JsonNode类在其自己的教程中进行了更详细的介绍,但是我仅在此处向我们展示如何使用它的基础知识。

将JSON解析为" JsonNode"(或者" JsonNode"实例的树)后,我们就可以浏览" JsonNode"树模型。这是一个" JsonNode"示例,显示了如何访问JSON字段,数组和嵌套对象:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5," +
        "  \"owners\" : [\"John\", \"Hyman\", \"Jill\"]," +
        "  \"nestedObject\" : { \"field\" : \"value\" } }";

ObjectMapper objectMapper = new ObjectMapper();

try {

    JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);

    JsonNode brandNode = jsonNode.get("brand");
    String brand = brandNode.asText();
    System.out.println("brand = " + brand);

    JsonNode doorsNode = jsonNode.get("doors");
    int doors = doorsNode.asInt();
    System.out.println("doors = " + doors);

    JsonNode array = jsonNode.get("owners");
    JsonNode jsonNode = array.get(0);
    String john = jsonNode.asText();
    System.out.println("john  = " + john);

    JsonNode child = jsonNode.get("nestedObject");
    JsonNode childField = child.get("field");
    String field = childField.asText();
    System.out.println("field = " + field);

} catch (IOException e) {
    e.printStackTrace();
}

注意,JSON字符串现在包含一个名为owners的数组字段和一个名为nestedObject的嵌套对象字段。

无论我们访问的是字段,数组还是嵌套对象,都可以使用JsonNode类的get()方法。通过提供字符串作为get()方法的参数,我们可以访问JsonNode的字段。如果JsonNode表示一个数组,则需要将索引传递给get()方法。索引指定要获取的数组中的元素。

将对象转换为JsonNode

可以使用Hymanson ObjectMapper将Java对象转换为" JsonNode",而" JsonNode"是转换后的Java对象的JSON表示。我们可以通过HymansonObjectMappervalueToTree()方法将Java对象转换为JsonNode。这是一个使用ObjectMappervalueToTree()方法将Java对象转换为JsonNode的示例:

ObjectMapper objectMapper = new ObjectMapper();

Car car = new Car();
car.brand = "Cadillac";
car.doors = 4;

JsonNode carJsonNode = objectMapper.valueToTree(car);

将JsonNode转换为对象

我们可以使用Hymanson ObjectMapper的treeToValue()方法将JsonNode转换为Java对象。这类似于使用Hymanson ObjectMapper将JSON字符串(或者其他来源)解析为Java对象。唯一的区别是,JSON源是JsonNode。这是一个使用HymansonObjectMappertreeToValue()方法将JsonNode转换为Java对象的示例:

ObjectMapper objectMapper = new ObjectMapper();

String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

JsonNode carJsonNode = objectMapper.readTree(carJson);

Car car = objectMapper.treeToValue(carJsonNode);

上面的示例有点"人为",我们首先将JSON字符串转换为" JsonNode",然后将" JsonNode"转换为" Car"对象。显然,如果我们有对原始JSON字符串的引用,则不妨先将其直接转换为Car对象,而无需先将其转换为JsonNode。但是,上面的示例构造为显示如何将" JsonNode"转换为Java对象。这就是为什么。

用Hymanson ObjectMapper读写其他数据格式

用Hymanson ObjectMapper可以读写JSON以外的其他数据格式。 Hymanson ObjectMapper也可以读取和写入以下数据格式(可能还有更多):

  • CBOR
  • MessagePack 消息包
  • YAML

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

用Hymanson ObjectMapper读写CBOR

CBOR是一种二进制数据格式,与JSON兼容,但比JSON更为紧凑,因此读写速度更快。 Hymanson ObjectMapper可以使用与读取和写入JSON相同的方式来读取和写入CBOR。为了使用Hymanson读写CBOR,我们需要在项目中添加一个额外的Maven依赖项。 Hymanson安装教程中介绍了如何添加Hymanson Hymanson CBOR Maven依赖项。这是使用HymansonObjectMapper将对象写入CBOR的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.dataformat.cbor.CBORFactory;

public class CborHymansonExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new CBORFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        try {
            byte[] cborBytes = objectMapper.writeValueAsBytes(employee);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

" cborBytes"字节数组包含序列化为CBOR数据格式的" Employee"对象。

这是一个将CBOR字节再次读回到Employee对象的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.dataformat.cbor.CBORFactory;

import java.io.IOException;

public class CborHymansonExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new CBORFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        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();
        }
    }
}

运行此代码后," employee2"将指向另一个" Employee"对象,但该对象等于" employee"指向的对象,因为该对象已序列化为CBOR并再次反序列化为" employee2"。

用Hymanson ObjectMapper读写MessagePack

YAML是一种文本数据格式,与JSON兼容,但更紧凑,因此读写速度更快。 Hymanson ObjectMapper可以使用与读取和写入JSON相同的方式来读取和写入MessagePack。为了使用Hymanson读写MessagePack,我们需要在项目中添加一个额外的Maven依赖项。 Hymanson安装教程中介绍了如何添加Hymanson消息包Maven依赖项。这是使用HymansonObjectMapper将对象写入MessagePack的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import org.msgpack.Hymanson.dataformat.MessagePackFactory;

import java.io.IOException;

public class MessagePackHymansonExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        byte[] messagePackBytes = null;
        try {
            messagePackBytes = objectMapper.writeValueAsBytes(employee);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            // normally, rethrow exception here - or don't catch it at all.
        }
    }
}

" messagePackBytes"字节数组包含序列化为MessagePack数据格式的" Employee"对象。

这是一个将MessagePack字节再次读回到Employee对象的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import org.msgpack.Hymanson.dataformat.MessagePackFactory;

import java.io.IOException;

public class MessagePackHymansonExample {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        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();
        }

    }
}

运行此代码后," employee2"将指向另一个" Employee"对象,但该对象等于" employee"指向的对象,因为该对象已序列化为MessagePack并反序列化为" employee2"。

用Hymanson ObjectMapper读写YAML

YAML是一种文本数据格式,类似于JSON,但使用不同的语法。 Hymanson ObjectMapper可以使用与读取和写入JSON相同的方式来读取和写入YAML。为了使用Hymanson读写YAML,我们需要在项目中添加一个额外的Maven依赖项。 Hymanson安装教程中介绍了如何添加Hymanson YAML Maven依赖项。这是使用HymansonObjectMapper将对象写入YAML的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.dataformat.yaml.YAMLFactory;

import java.io.IOException;

public class YamlHymansonExample {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        String yamlString = null;
        try {
            yamlString = objectMapper.writeValueAsString(employee);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            // normally, rethrow exception here - or don't catch it at all.
        }

    }
}

yamlString变量包含执行此代码后序列化为YAML数据格式的Employee对象。

这是将YAML文本再次读入Employee对象的示例:

import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.dataformat.yaml.YAMLFactory;

import java.io.IOException;

public class YamlHymansonExample {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());

        Employee employee = new Employee("John Doe", "[email protected]");

        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();
        }

    }
}

运行此代码后," employee2"将指向另一个" Employee"对象,但该对象等于" employee"指向的对象,因为该对象已序列化为YAML并再次反序列化为" employee2"。