
Java实体在xml和json之间相互转换
一、相关注解与方法
1.注解(部分)
@JsonProperty:把属性的名称序列化成另一个名称
@JsonFormat:日期格式转换(例如:@JsonFormat(timezone=“GTM+8”,pattern=“yyyy-MM-dd HH:mm:ss”))
@JsonIgnoreProperties:忽略类的某个属性(作用于类,例如:@JsonIgnoreProperties({“属性1”,“属性2”}))
@JsonIgnore:忽略类的某个属性(作用于属性,直接在属性加注解即可)
@JacksonXmlElementWrapper:可用于指定List等集合类,设置外围标签名与是否设置外围标签
@JacksonXmlProperty:指定包装标签名,或者指定标签内部属性名
@JacksonXmlRootElement:指定生成xml根标签的名字
@JacksonXmlText:指定当前值,没有xml标签包裹
【tips】
在类中的部分属性使用@JsonProperty和@JacksonXmlProperty注解时,生成的XML字符串标签顺序可能会发生改变
2.方法(主要)
XmlMapper类的方法
实体类(任意类型)解析为xml的字符串
String writeValueAsString(Object var1);
把字符串转换为实体类
<T> T readValue(String var1, Class<T> var2);
读取xml字符串为json格式
JsonNode readTree(String var1);
JsonNode类的方法
获取json中的某个节点值
JsonNode get(String var1);
二、使用步骤
1.新建实体类
@Data
public class Student {
private String studentNo;
private String studentName;
2.新建测试类
【tips】
代码中打印语句后的注释为控制台打印的结果
public class Demo {
//创建XmlMapper对象,用于实体与json和xml之间的相互转换
private static final XmlMapper XML_MAPPER = new XmlMapper();
public static void main(String[] args) throws Exception {
Student s = new Student();
s.setStudentNo("202101001");
s.setStudentName("张三");
//实体类解析为xml的字符串(理论上可以将任意类型解析为xml字符串)
String xmlStr = XML_MAPPER.writeValueAsString(s);
System.out.println(xmlStr);//<Student xmlns=""><studentNo>202101001</studentNo><studentName>张三</studentName></Student>
//把字符串转换为实体类
Student student = XML_MAPPER.readValue(xmlStr, Student.class);
System.out.println(student);//Student(studentNo=202101001, studentName=张三)
//读取xml字符串为json格式
JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
System.out.println(jsonNode);//{"studentNo":"202101001","studentName":"张三"}
//获取json中的某一个节点值
JsonNode studentNo = jsonNode.get("studentNo");
System.out.println(studentNo);//"202101001"
三、综合案例
1.实体类部分
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.Data;
import java.util.List;
* @author 二师兄想吃肉
* @version V1.0
* @Title:
* @Description:
* @date 2021/1/10 21:40
@Data
@JsonIgnoreProperties({"ignore"})//忽略类的某个属性
public class Clazz {
//把属性的名称序列化成另一个名称
@JsonProperty("CLAZZNO")
private String clazzNo;
//指定包装标签名,或者指定标签内部属性名
@JacksonXmlProperty(localName = "CLAZZNAME")
private String clazzName;
//忽略类的某个属性
@JsonIgnore
private String ignore;
private Teacher teacher;
//不使用外围标签
// @JacksonXmlElementWrapper(useWrapping = false)
//指定外围标签名
@JacksonXmlElementWrapper(localName = "studentList")
//指定标签名
@JacksonXmlProperty(localName = "student")
private List<Student> studentList;
@Data
class Teacher {
private String teacherName;
private String teacherSex;
@Data
class Student {
private String studentNo;
private String studentName;
2.测试类部分
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.util.ArrayList;
import java.util.List;
* @author 二师兄想吃肉
* @version V1.0
* @Title:
* @Description:
* @date 2021/1/10 21:43
public class Demo {
//创建XmlMapper对象,用于实体与json和xml之间的相互转换
private static final XmlMapper XML_MAPPER = new XmlMapper();
public static void main(String[] args) throws Exception{
Clazz c = new Clazz();
c.setClazzNo("201802");
c.setClazzName("三年级2班");
c.setIgnore("这是被忽略的属性");
Teacher t = new Teacher();
t.setTeacherName("宋老师");
t.setTeacherSex("男");
c.setTeacher(t);
List<Student> students = new ArrayList<>();
Student s1 = new Student();
s1.setStudentNo("202101001");
s1.setStudentName("张三");
Student s2 = new Student();
s2.setStudentNo("202101002");
s2.setStudentName("李四");
students.add(s1);
students.add(s2);
c.setStudentList(students);
//实体类解析为xml的字符串
String xmlStr = XML_MAPPER.writeValueAsString(c);
System.out.println(xmlStr);
//把某一类型的东西转换为实体类
Clazz clazz = XML_MAPPER.readValue(xmlStr, Clazz.class);
System.out.println(clazz);
//取出Clazz类的studentList属性并打印
List<Student> studentList = clazz.getStudentList();
System.out.println(studentList);
//读取xml字符串为json格式
JsonNode jsonNode = XML_MAPPER.readTree(xmlStr);
System.out.print(jsonNode);
<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>
Clazz(clazzNo=201802, clazzName=三年级2班, ignore=null, teacher=Teacher(teacherName=宋老师, teacherSex=男), studentList=[Student(studentNo=202101001, studentName=张三), Student(studentNo=202101002, studentName=李四)])
[Student(studentNo=202101001, studentName=张三), Student(studentNo=202101002, studentName=李四)]
{"teacher":{"teacherName":"宋老师","teacherSex":"男"},"CLAZZNO":"201802","CLAZZNAME":"三年级2班","studentList":{"student":{"studentNo":"202101002","studentName":"李四"}}}
【tips】
以下个人观点,还请指正,写demo的时候发现的问题
使用readTree方法读取字符串为json格式时,如果读取到集合类型,那么最终结果可能是集合只会保留一条数据且为最后一条,之前的有可能会被覆盖掉。
收藏 1
回复
1
删除帖子
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源
去关联
添加资源
相关推荐
-
DevEco Studio 如何将SVG文件
转换
为
XML
文件
jowvid
• 8847浏览
• 0回复
-
TV屏
之间
跳转以及回传值练习
鸿蒙时代
• 5386浏览
• 2回复
-
#2020征文-开发板#SYS_RUN()
和
MODULE_INIT()
之间
的那些事
唐佐林
• 1.8w浏览
• 10回复
-
【直播课件】#2020征文-手机#
Java
UI组件
和
布局Demo代码
董昱
• 1.4w浏览
• 11回复
-
在
鸿蒙上实现本地
和
Internet视频资源播放
attitude
• 1.8w浏览
• 7回复
-
在
HarmonyOS手机上玩计算机视觉技术!约吗?
唐佐林
• 1.6w浏览
• 13回复
-
【6月29日公开课】鸿蒙服务卡片
之间
还可以交互,还可以玩游戏
蒙娜丽宁
• 8320浏览
• 1回复
-
鸿蒙混合打包(支持安卓、鸿蒙
相互
调用)
没用的喵叔
• 2.9w浏览
• 49回复
-
【中软国际】ActiveData
在
HarmonyOS中的原理分析
和
运用
中软HOS小鸿
• 1.3w浏览
• 28回复
-
HarmonyOS应用配置文件config.
json
starLWW
• 1.6w浏览
• 3回复
-
【FFH】OpenHarmony啃论文成长计划---为什么
JSON
将逐渐取代
XML
?
Hagon
• 8631浏览
• 1回复
-
【FFH】OpenHarmony啃论文成长计划---
JSON
-RPC
Hagon
• 9859浏览
• 1回复
-
#过年不停更#鸿蒙学习笔记之使用
XML
方式创建布局
宇宙之一粟
• 6125浏览
• 0回复
-
移植案例与原理 - HPM包描述文件bundle.
json
zhushangyuan_
• 9434浏览
• 4回复
-
[OpenHarmony啃论文俱乐部]
JSON
和
XML
数据交换格式的比较
亚森罗平
• 4866浏览
• 0回复
-
HarmonyOS css样式与普通HTML css样式
之间
存在的区别
中软小助手
• 6069浏览
• 1回复
-
鸿蒙app访问网络
和
json
解析(导入第三方依赖)
^浅忆佳瓦~苦思甜
• 5571浏览
• 0回复
-
HarmonyOSConnect套餐一:产品
json
文件配置与固件烧录
拓维信息_hyh
• 4539浏览
• 2回复
-
【FFH】啃论文俱乐部---
JSON
压缩算法解读
Hagon
• 3849浏览
• 3回复
帖子
视频
声望
粉丝
关注
最近发布
-
好像又有新板子玩了,最起码是个L2,多少钱不太清楚
2021-12-21 21:56:53发布
-
鸿蒙3.0或将发布!华为年度盛会曝光
2021-09-15 18:59:24发布