用Jackson映射序列化和反序列化
最后修改:2020年9月30日
1.概述
在本文中,我们将看看Java映射的序列化和反序列化使用杰克逊。
我们将演示如何序列化和反序列化Map < String, String >,> <地图对象,字符串,和<地图对象,对象>从json格式字符串。
进一步阅读:
2.Maven配置
<依赖> < groupId > com.fasterxml.jackson。jackson-databind 2.11.1
你可以得到杰克逊的最新版本在这里。
3.序列化
序列化将Java对象转换为字节流,可以根据需要持久化或共享字节流。Java地图集合映射一个键吗对象一个值对象并且通常是最不容易序列化的对象。
3.1。Map < String, String >序列化
对于这个简单的例子,我们创建一个Map < String, String >并将其序列化为JSON:
Map Map = new HashMap<>();地图。把(“关键”、“价值”);objectapper mapper = new objectapper ();String jsonResult = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(map);
objectmapJackson的序列化映射器,它允许我们序列化我们的地图然后把它写成一个漂亮的JSON字符串,使用toString ()方法字符串:
{"key": "value"}
3.2。<地图对象,字符串>序列化
只需几个额外步骤,就可以序列化包含自定义Java类的映射。让我们创建一个MyPair类来表示一对相关的字符串对象。
注意:getter /setter应该是公共的,我们需要注释toString ()与@JsonValue确保杰克逊使用这一习俗toString ()当序列化:
public class MyPair {private String first;私人字符串第二;@Override @JsonValue public String toString() {return first + " and " + second;} //标准的getter, setter, equals, hashCode, constructor}
现在让我们告诉杰克逊如何连载MyPair通过扩展杰克逊JsonSerializer:
public class MyPairSerializer extends JsonSerializer {private objectapper mapper = new objectapper ();@Override public void serialize(MyPair value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {StringWriter writer = new StringWriter();映射器。writeValue(作家、价值);gen.writeFieldName (writer.toString ());}}
JsonSerializer,顾名思义,是连载的MyPairJSON使用MyPair的toString ()方法。杰克逊提供了许多序列化器类以满足您的序列化需求。
我们应用MyPairSerializer对我们的Map < MyPair,字符串>与@JsonSerialize注释。请注意,我们只告诉Jackson如何连载MyPair因为它已经知道如何序列化了字符串:
@JsonSerialize(keyUsing = MyPairSerializer.class) Map Map;
让我们测试一下我们的map序列化:
map = new HashMap<>();MyPair key = new MyPair("Abbott", "Costello"); / /创建一个MyPair地图。把(键,“喜剧”);String jsonResult = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(map);
序列化的JSON输出是:
{阿伯特和科斯特洛:喜剧}
3.3。<地图对象,对象>序列化
最复杂的情况是序列化<地图对象,对象>但大部分工作已经完成。让我们用杰克逊MapSerializer我们的地图,还有MyPairSerializer前一节介绍了map的键和值类型:
@JsonSerialize(keyUsing = MapSerializer.class) Map Map;@JsonSerialize(keyUsing = MyPairSerializer.class) MyPair mapKey;@JsonSerialize(keyUsing = MyPairSerializer.class) MyPair mapValue;
让我们测试一下序列化Map < MyPair, MyPair >:
mapKey = new MyPair("Abbott", "Costello"); / /创建一个新对象mapValue = new MyPair("Comedy", "1940 "); / /创建一个新对象地图。把(mapKey mapValue);String jsonResult = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(map);
序列化的JSON输出,使用MyPair的toString ()方法是:
{“阿伯特和科斯特洛”:“喜剧和1940年代”}
4.反序列化
反序列化将字节流转换为可以在代码中使用的Java对象。在本节中,我们将把JSON输入反序列化为地图年代不同的签名。
4.1。Map < String, String >反序列化
对于这个简单的例子,我们取一个json格式的输入字符串并将其转换为Map < String, String >Java集合:
String jsonInput = "{\"key\": \"value\"}";HashMap> typeRef = new TypeReference< String, String>>() {};Map Map = mapper。readValue (jsonInput typeRef);
我们使用杰克逊objectmap正如我们在序列化中所做的那样,使用readValue ()来处理输入。同时,注意我们使用的Jackson’sTypeReference,我们将在所有反序列化示例中使用它来描述目标的类型地图。这是toString ()我们地图的表示:
{键=值}
4.2。<地图对象,字符串>反序列化
现在,让我们更改输入JSON和TypeReference我们的目的地是Map < MyPair,字符串>:
String jsonInput = "{\"Abbott and Costello\": \"Comedy\"}";HashMap>() {};Map Map = mapper。readValue (jsonInput typeRef);
我们需要创建一个构造函数MyPair这需要一个字符串元素,并将它们解析为MyPair元素:
public MyPair(String both) {String[] pairs = both.split("and");这一点。第一个[0]=对.trim ();这一点。年代econd = pairs[1].trim(); }
和toString ()我们的Map < MyPair,字符串>对象是:
{雅培和科斯特洛=喜剧}
当我们反序列化到包含a地图-我们可以用杰克逊的KeyDeserializer类,许多人中的一个反序列化杰克逊提供的课程。我们标注了ClassWithAMap与@JsonCreator,@JsonProperty,@JsonDeserialize:
@JsonProperty("map") @JsonDeserialize(keyUsing = MyPairDeserializer.class) private map map;@JsonCreator public ClassWithAMap(Map Map){这个。地图=地图;} // public getter /setter省略}
我们让杰克逊去反序列化Map < MyPair,字符串>包含在ClassWithAMap所以我们需要扩展KeyDeserializer为了描述如何反序列化映射的键,aMyPair对象,来自输入字符串:
public class MyPairDeserializer extends KeyDeserializer {@Override public MyPair deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {return new MyPair(key);}}
我们使用readValue:
String jsonInput = "{\"Abbott and Costello\":\"Comedy\"}";classWithMap = mapper。readValue(jsonInput, ClassWithAMap.class);
再一次,toString ()我们的方法ClassWithAMap的map给出了我们期望的输出:
{雅培和科斯特洛=喜剧}
4.3。<地图对象,对象>反序列化
最后,让我们更改输入JSON和TypeReference我们的目的地是Map < MyPair, MyPair >:
String jsonInput = "{\"Abbott and Costello\": \"Comedy and 1940 \"}";HashMap< HashMap>() {};Map Map = mapper。readValue (jsonInput typeRef);
和toString ()我们的Map < MyPair, MyPair >对象是:
{阿伯特和科斯特洛= 20世纪40年代的喜剧}
5.结论
在这篇快速教程中,我们已经了解了如何序列化和反序列化Java地图进出json格式的字符串。
与往常一样,您可以在GitHub库。