Spring序列化与反序列化

来源:互联网 发布:软件配置管理人员职责 编辑:程序博客网 时间:2024/04/30 09:45

环境准备:

使用的是maven管理jar包

使用的是jackson-databind

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

代码准备:

Student类以及相应的get set方法

public class Student {private long id;private String name;}
Teacher类以及相应的get set方法

public class Teacher {private long id;private String name;}
Record类以及相应的get set方法

public class Record {private Student student;private Teacher teacher;private String className;//班级名称}
RecordList类以及相应的get set方法

public class RecordList {private List<Record> list;}

测试数据:创建一个包含很多Record的

RecordList recordList=new RecordList();List<Record> list = new ArrayList<Record>();for (int i = 1; i <= 3; i++) {Record record = new Record();Student student = new Student();Teacher teacher = new Teacher();student.setId(i);student.setName("stuName---" + i);teacher.setId(i);teacher.setName("teaName---" + i);record.setClassName("class " + i);record.setStudent(student);record.setTeacher(teacher);list.add(record);}recordList.setList(list);String serialized = new ObjectMapper().writeValueAsString(recordList);System.out.println(serialized);

序列化结果

{    "list": [        {            "student": {                "id": 1,                "name": "stuName---1"            },            "teacher": {                "id": 1,                "name": "teaName---1"            },            "className": "class 1"        },        {            "student": {                "id": 2,                "name": "stuName---2"            },            "teacher": {                "id": 2,                "name": "teaName---2"            },            "className": "class 2"        },        {            "student": {                "id": 3,                "name": "stuName---3"            },            "teacher": {                "id": 3,                "name": "teaName---3"            },            "className": "class 3"        }    ]}

反序列化:

RecordList item = new ObjectMapper().readValue(serialized, RecordList.class);System.out.println("反序列化:"+item.toString());

自定义的序列化

public class RecordListSerializer extends JsonSerializer<RecordList> {@Overridepublic void serialize(RecordList value, JsonGenerator jsonGenerator, SerializerProvider provider)throws IOException, JsonProcessingException {List<Record> list= value.getList();String stuInfos="";String teacherInfos="";String classInfos="";for(Record record:list){stuInfos+=record.getStudent().getId()+" : "+record.getStudent().getName()+"  ";teacherInfos+=record.getTeacher().getId()+" : "+record.getTeacher().getName()+"  ";classInfos+=record.getClassName()+"  ";}jsonGenerator.writeStartObject();jsonGenerator.writeStringField("stuInfos", stuInfos);jsonGenerator.writeStringField("teacherInfos",teacherInfos);jsonGenerator.writeStringField("classInfos",classInfos);jsonGenerator.writeEndObject();}}
ObjectMapper mapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(RecordList.class, new RecordListSerializer());mapper.registerModule(module);String ser = null;try {ser = mapper.writeValueAsString(recordList);} catch (JsonProcessingException e) {e.printStackTrace();}System.out.println(ser);
序列化结果:

{    "stuInfos": "1 : stuName---1  2 : stuName---2  3 : stuName---3  ",    "teacherInfos": "1 : teaName---1  2 : teaName---2  3 : teaName---3  ",    "classInfos": "class 1  class 2  class 3  "}
自定义反序列化

只解析了classInfos

public class RecordListDeserializer extends JsonDeserializer<RecordList> {@Overridepublic RecordList deserialize(JsonParser jp, DeserializationContext ctxt)throws IOException, JsonProcessingException {JsonNode node = jp.getCodec().readTree(jp);String className = node.get("classInfos").asText();RecordList recordList = new RecordList();String[] s = className.split("  ");List<Record> list = new ArrayList<Record>();for(int i=0;i<s.length;i++){Record r=new Record();list.add(r);}for (int i = 0; i < s.length; i++) {list.get(i).setClassName(s[i]);}recordList.setList(list);return recordList;}}
ObjectMapper mapper1 = new ObjectMapper();SimpleModule module1 = new SimpleModule();module.addDeserializer(RecordList.class, new RecordListDeserializer());mapper.registerModule(module);RecordList readValue = mapper.readValue(ser, RecordList.class);System.out.println(readValue.toString());
结果为:

RecordList [list=[Record [student=null, teacher=null, className=class 1], Record [student=null, teacher=null, className=class 2], Record [student=null, teacher=null, className=class 3]]]

还有一种简单的方式就是用注解

@JsonSerialize(using = RecordListSerializer.class)@JsonDeserialize(using = RecordListDeserializer.class) public class RecordList {private List<Record> list;@Overridepublic String toString() {return String.format("RecordList [list=%s]", list);}public List<Record> getList() {return list;}public void setList(List<Record> list) {this.list = list;}}
使用就像这样即可

String serialized = new ObjectMapper().writeValueAsString(recordList);System.out.println(serialized);











0 0
原创粉丝点击