Java 实体 xml 和 json 之间相互转换

缺乏、安全感 2023-01-05 01:21 283阅读 0赞

一、相关注解与方法

1.注解(部分)

  1. @JsonProperty:把属性的名称序列化成另一个名称
  2. @JsonFormat:日期格式转换(例如:@JsonFormat(timezone=“GTM+8”,pattern=“yyyy-MM-dd HH:mm:ss”))
  3. @JsonIgnoreProperties:忽略类的某个属性(作用于类,例如:@JsonIgnoreProperties({“属性1”,“属性2”}))
  4. @JsonIgnore:忽略类的某个属性(作用于属性,直接在属性加注解即可)
  5. @JacksonXmlElementWrapper:可用于指定List等集合类,外围标签名
  6. @JacksonXmlProperty:指定包装标签名,或者指定标签内部属性名
  7. @JacksonXmlRootElement:指定生成xml根标签的名字
  8. @JacksonXmlText:指定当前值,没有xml标签包裹
  9. tips
  10. 在类中的部分属性使用@JsonProperty@JacksonXmlProperty注解时,生成的XML字符串标签顺序可能会发生改变

2.方法(主要)

XmlMapper类的方法

  1. 实体类(任意类型)解析为xml的字符串
  2. String writeValueAsString(Object var1);
  3. 把字符串转换为实体类
  4. <T> T readValue(String var1, Class<T> var2);
  5. 读取xml字符串为json格式
  6. JsonNode readTree(String var1);

JsonNode类的方法

  1. 获取json中的某个节点值
  2. JsonNode get(String var1);

二、使用步骤

1.新建实体类

  1. //java项目www.fhadmin.org
  2. @Data
  3. public class Student {
  4. private String studentNo;
  5. private String studentName;
  6. }

2.新建测试类

【tips】
代码中打印语句后的注释为控制台打印的结果

  1. //java项目www.fhadmin.org
  2. public class Demo {
  3. //创建XmlMapper对象,用于实体与json和xml之间的相互转换
  4. private static final XmlMapper XML_MAPPER = new XmlMapper();
  5. public static void main(String[] args) throws Exception {
  6. Student s = new Student();
  7. s.setStudentNo("202101001");
  8. s.setStudentName("张三");
  9. //实体类解析为xml的字符串(理论上可以将任意类型解析为xml字符串)
  10. String xmlStr = XML_MAPPER.writeValueAsString(s);
  11. System.out.println(xmlStr);//<Student xmlns=""><studentNo>202101001</studentNo><studentName>张三</studentName></Student>
  12. //把字符串转换为实体类
  13. Student student = XML_MAPPER.readValue(xmlStr, Student.class);
  14. System.out.println(student);//Student(studentNo=202101001, studentName=张三)
  15. //读取xml字符串为json格式
  16. JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
  17. System.out.println(jsonNode);//{"studentNo":"202101001","studentName":"张三"}
  18. //获取json中的某一个节点值
  19. JsonNode studentNo = jsonNode.get("studentNo");
  20. System.out.println(studentNo);//"202101001"
  21. }
  22. }

运行结果
在这里插入图片描述

三、综合案例

1.实体类部分

  1. import com.fasterxml.jackson.annotation.JsonIgnore;
  2. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  3. import com.fasterxml.jackson.annotation.JsonProperty;
  4. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
  5. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
  6. import lombok.Data;
  7. import java.util.List;
  8. /**
  9. * @java项目 www.fhadmin.org
  10. * @version V1.0
  11. * @Title:
  12. * @Description:
  13. * @date 2021/1/10 21:40
  14. */
  15. @Data
  16. @JsonIgnoreProperties({"ignore"})//忽略类的某个属性
  17. public class Clazz {
  18. //把属性的名称序列化成另一个名称
  19. @JsonProperty("CLAZZNO")
  20. private String clazzNo;
  21. //指定包装标签名,或者指定标签内部属性名
  22. @JacksonXmlProperty(localName = "CLAZZNAME")
  23. private String clazzName;
  24. //忽略类的某个属性
  25. @JsonIgnore
  26. private String ignore;
  27. private Teacher teacher;
  28. //指定外围标签名
  29. @JacksonXmlElementWrapper(localName = "studentList")
  30. //指定标签名
  31. @JacksonXmlProperty(localName = "student")
  32. private List<Student> studentList;
  33. }
  34. @Data
  35. class Teacher {
  36. private String teacherName;
  37. private String teacherSex;
  38. }
  39. @Data
  40. class Student {
  41. private String studentNo;
  42. private String studentName;
  43. }

2.测试类部分

  1. import com.fasterxml.jackson.databind.JsonNode;
  2. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * @java项目www.fhadmin.org
  7. * @version V1.0
  8. * @Title:
  9. * @Description:
  10. * @date 2021/1/10 21:43
  11. */
  12. public class Demo {
  13. //创建XmlMapper对象,用于实体与json和xml之间的相互转换
  14. private static final XmlMapper XML_MAPPER = new XmlMapper();
  15. public static void main(String[] args) throws Exception{
  16. Clazz c = new Clazz();
  17. c.setClazzNo("201802");
  18. c.setClazzName("三年级2班");
  19. c.setIgnore("这是被忽略的属性");
  20. Teacher t = new Teacher();
  21. t.setTeacherName("宋老师");
  22. t.setTeacherSex("男");
  23. c.setTeacher(t);
  24. List<Student> students = new ArrayList<>();
  25. Student s1 = new Student();
  26. s1.setStudentNo("202101001");
  27. s1.setStudentName("张三");
  28. Student s2 = new Student();
  29. s2.setStudentNo("202101002");
  30. s2.setStudentName("李四");
  31. students.add(s1);
  32. students.add(s2);
  33. c.setStudentList(students);
  34. //实体类解析为xml的字符串
  35. String xmlStr = XML_MAPPER.writeValueAsString(c);
  36. System.out.println(xmlStr);
  37. //把某一类型的东西转换为实体类
  38. Clazz clazz = XML_MAPPER.readValue(xmlStr, Clazz.class);
  39. System.out.println(clazz);
  40. //取出Clazz类的studentList属性并打印
  41. List<Student> studentList = clazz.getStudentList();
  42. System.out.println(studentList);
  43. //读取xml字符串为json格式
  44. JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
  45. System.out.print(jsonNode);
  46. }
  47. }

运行结果

  1. <Clazz xmlns=""><teacher><teacherName>宋老师</teacherName><teacherSex></teacherSex></teacher><CLAZZNO>201802</CLAZZNO><CLAZZNAME>三年级2班</CLAZZNAME><studentList><student><studentNo>202101001</studentNo><studentName>张三</studentName></student><student><studentNo>202101002</studentNo><studentName>李四</studentName></student></studentList></Clazz>
  2. Clazz(clazzNo=201802, clazzName=三年级2班, ignore=null, teacher=Teacher(teacherName=宋老师, teacherSex=男), studentList=[Student(studentNo=202101001, studentName=张三), Student(studentNo=202101002, studentName=李四)])
  3. [Student(studentNo=202101001, studentName=张三), Student(studentNo=202101002, studentName=李四)]
  4. {"teacher":{"teacherName":"宋老师","teacherSex":"男"},"CLAZZNO":"201802","CLAZZNAME":"三年级2班","studentList":{"student":{"studentNo":"202101002","studentName":"李四"}}}

![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]

[wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]:

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读