一、前言

json 与xml格式相互和常见,对于不用的系统,有的系统可能是json格式,有的可能是xml格式,对于一些中间平台,从第一个平台获取到的数据可能是json格式,等到自己处理完需要给另一个平台校验的却是xml格式,同时在xml中字段全大写或者首字母大写,或者某个词特有。对日期格式的要求也可能不同。自己遇到了,总结下来;

二、环境

开发工具: IDEA
json : fastJson (阿里的,这几种jsno里性能优秀的一个,网上有比对信息)
xml转换工具: thoughtworks.xstream (转换方便,效率也还Ok)

三、 Maven 依赖

1) fastjson 依赖

<!-- 阿里巴巴JSON处理器--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency>
  1. xstream依赖
<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.10</version></dependency>

四、Model 类(报文)

每个公司可能有不同的要求,比如对于一个实体,可能都要求用Entity结尾,我们是用Model结尾,如果是这样,如果不做处理,直接转换是会出问题的。所以才有了这篇文章。
1) RequestModel

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;/*** @ClassName : RequestModel* @描述 : request(报文)* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 9:59**/
public class RequestModel {@XStreamAlias("Header")private RequestHeader header;// 请求头@XStreamAlias("Body")private RequestBody body;// 请求体// 省略set、get以及toString 方法
}

2)RequestHeadel

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.Date;
/*** @ClassName : RequestHeader* @描述 : 请求头* @Author :  zlc* @Date : 2019/9/9 9:59**/
public class RequestHeader {@XStreamAlias("Method")private String requestMethod;@XStreamAlias("TimeStamp")private Date sendTime;@XStreamAlias("WhereFrom")private String whereFrom;// 省略set、get以及toString方法}

3) RequestBody

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;/*** @ClassName : RequestBody* @描述 : 请求体* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 9:59**/
public class RequestBody {@XStreamAlias("Teacher")private TeacherModel teacherModel;@XStreamAlias("Grade")private GradeModel gradeModel;// 省略set、get以及toString方法
}

4) TeacherModel

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;/*** @ClassName : TeacherModel* @描述 : 教师* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 10:22**/
public class TeacherModel {@XStreamAlias("ID")private Integer id;@XStreamAlias("Name")private String name;
}

5)GradeModel

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;import java.util.List;/*** @ClassName : GradeModel* @描述 : 年级* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 10:16**/
public class GradeModel {private Integer id;@XStreamAlias("Name")private String name;@XStreamImplicit(itemFieldName="Students")private List<StudentModel> students;}

6)StudentModel

package com.zlc.model;import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.zlc.xmltool.XmlDateConverter;import java.util.Date;/*** @ClassName : StudentModel* @描述 : 学生* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 10:16**/
public class StudentModel {@XStreamAlias("ID")private Integer id;@XStreamAlias("FirstName")private String firstName;@XStreamAlias("LastName")private String lastName;@XStreamAlias("Birthday")@XStreamConverter(value = XmlDateConverter.class)private Date birthday;@XStreamAlias("City")private String city;@XStreamAlias("Age")private int age;
}
  1. XmlDateConverter 日期转换器
package com.zlc.xmltool;import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** ClassName : XmlDateConverter* 描述 : Xml日期转换器,设定时间格式  XStream 支持时间格式为:yyyy-MM-dd HH:mm:ss. 'UTC'(根据需要配置时间格式)* Use:  可以通过注解的形式配置在 日期格式的类属性上,应用于序列化为XML时* Example :  @XStreamConverter(value = XmlDateConverter.class)private Date cvalidate;* Data : 2019/8/8 10:03* @author zlc**/
public class XmlDateConverter  extends AbstractSingleValueConverter {private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");@Overridepublic boolean canConvert(Class type) {return type.equals(Date.class);}@Overridepublic Object fromString(String str) {try {return dateFormat.parseObject(str);} catch (ParseException e) {e.printStackTrace();}throw new ConversionException("Cannot parse date " + str);}@Overridepublic String toString(Object obj) {return dateFormat.format((Date) obj);}}

五、说明

这种方法就是通过注解的方法将实体转换为xml时为其取个别名,这样就可以在 不影响java的驼峰的规则下,对实体进行“定制”。日期转换器是为了对日期的格式进行设置,可以看日期转化器上面的注解,进行过测试了;对于list集合属性,可以通过使用注解@XStreamImplicit(itemFieldName=“XXX”) 进行设置;

1)注解 @XStreamAlias(“ProdCount”) 可以为普通的字段进行别名设置
2)注解 @XStreamImplicit(itemFieldName=“Product”) 可以对list集合进行别名设置
3)注解 @XStreamConverter(value = XmlDateConverter.class) 日期转化器
4)注解 @XStreamOmitField 忽略某个字段

六、测试

对于直接将json字符串转换为对象,下篇介绍吧,挺简单的;测试就是用对象直接去设置,最后打印获取到的xml格式报文;
1)测试main (ps: 因为把这些直接弄成json格式的String有点长,同时这些都是我自己新写的测试类,所以没有贴公司的真正报文,保密)

package com.zlc.main;import com.thoughtworks.xstream.XStream;
import com.zlc.model.*;
import com.zlc.vo.Student;
import com.zlc.xmltool.XmlTransformationTool;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @ClassName : JsonToXmlMain* @描述 : 测试main* @Author :  追到乌云的尽头找太阳* @Date : 2019/9/9 19:36**/
public class JsonToXmlMain {public static void main(String[] args) {RequestModel requestModel = new RequestModel();// 请求头RequestHeader header = new RequestHeader();header.setRequestMethod("POST");header.setWhereFrom("127.0.0.250");header.setSendTime(new Date());requestModel.setHeader(header);// 请求体RequestBody body = new RequestBody();// 教师TeacherModel teacherModel = new TeacherModel();teacherModel.setId(1);teacherModel.setName("乌云");body.setTeacherModel(teacherModel);// 年级GradeModel gradeModel = new GradeModel();gradeModel.setId(2);gradeModel.setName("社会一年级");// 学生集合List<StudentModel> students = new ArrayList<>();StudentModel studentModel1 = new StudentModel();studentModel1.setId(123);studentModel1.setAge(24);Date date = new Date();studentModel1.setBirthday(new Date());studentModel1.setCity("北京");studentModel1.setFirstName("赵");studentModel1.setLastName("大大");students.add(studentModel1);StudentModel studentModel2 = new StudentModel();studentModel2.setId(213);studentModel2.setAge(24);studentModel2.setBirthday(new Date());studentModel2.setCity("上海");studentModel2.setFirstName("钱");studentModel2.setLastName("大大");students.add(studentModel2);StudentModel studentModel3 = new StudentModel();studentModel3.setId(321);studentModel3.setAge(24);studentModel3.setBirthday(new  Date());studentModel3.setCity("山西");studentModel3.setFirstName("薛");studentModel3.setLastName("小小");students.add(studentModel3);gradeModel.setStudents(students);body.setGradeModel(gradeModel);requestModel.setBody(body);XStream xStream = new XStream();xStream.alias("Package", RequestModel.class);xStream.processAnnotations(RequestModel.class);String message = xStream.toXML(requestModel);System.out.println(message);}
}

2)测试结果 xml报文

"D:\Program Files\Java\jdk1.8.0_31\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA <Request><Header><Method>POST</Method><TimeStamp>2019-09-10 01:34:00.789 UTC</TimeStamp><WhereFrom>127.0.0.250</WhereFrom></Header><Body><Teacher><ID>1</ID><Name>乌云</Name></Teacher><Grade><id>2</id><Name>社会一年级</Name><Students><ID>123</ID><FirstName>赵</FirstName><LastName>大大</LastName><Birthday>2019-09-10</Birthday><City>北京</City><Age>24</Age></Students><Students><ID>213</ID><FirstName>钱</FirstName><LastName>大大</LastName><Birthday>2019-09-10</Birthday><City>上海</City><Age>24</Age></Students><Students><ID>321</ID><FirstName>薛</FirstName><LastName>小小</LastName><Birthday>2019-09-10</Birthday><City>山西</City><Age>24</Age></Students></Grade></Body>
</Request>Process finished with exit code 0

注意:对于日期类型的字段,需要使用Date类型,如果是String类型,上面的日期类型转换器会报错,以后扩展;上面的日期转化器可以根据需要改成自己的日期格式,将日期格式作为参数进行控制。

七、补充

如果想要在对象中忽略某个字段,可以使用注解 @XStreamOmitField
再说明一点,因为我在公司实际是拿到的首字母什么的是小写的报文,我是先转化为的对象,然后将对象转换为xml;将json转换为对象这个下篇写吧。如果json格式的报文中没有对象中的某个字段,这个时候转化时是不进行转换的,所以上面的那个注解我实际没有用到。搬砖了!

Json转XML后将首字母大写(或者其他自己的需求格式)对象中包含list集合以及日期字段的处理(注解形式)相关推荐

  1. java bean 首字母大写_javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  2. java set get大写_javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  3. python3汉字转拼音后汉语拼音首字母大写

    首先先装pypinyin类库 pip install pypinyin 导入类库 import pypinyin def HanYuZhuanPinYinShouZiMuDaXie(word):#汉字 ...

  4. Json RequestBody日期相差8小时及首字母大写问题

    数据库和postman相差8个小时,debug后发现是jackson得问题.如果要解决这种问题,用文件配置可以解决#application.properties文件配置 spring.jackson. ...

  5. 程序员必须要懂的首字母大写规范

    首字母大写规范指南 不管是在生活写作中,还是创建 Pull Request,或者给开源项目提交 Issue 的时候,我们都需要用到英文标题,那么对于哪些部分需要首字母大写,则是一件头疼的事情,下面详细 ...

  6. mysql首字母大写函数_string - 首字母大写。MySQL的

    string - 首字母大写.MySQL的 在MySQL的说法中,有没有人知道这个TSQL的等价物? 我想把每个条目的第一个字母大写. UPDATE tb_Company SET CompanyInd ...

  7. 已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)

    已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为"名"+空格+"姓":并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写.(后附 ...

  8. Js 将JSON内部key值转换大小写和首字母大写

    /*** @param {Object} json* @param {Object} type: 默认不传 ==>全部小写;传1 ==>全部大写;传2 ==>首字母大写* 将json ...

  9. B 字符串处理1000MS64MB Description 输入一个英文名字。去掉该英文名字两端的空格,并首字母大写后,输出问候语Hello, 加名字 Input 一个英文名字 Output 去

    B 字符串处理1000MS64MB Description 输入一个英文名字.去掉该英文名字两端的空格,并首字母大写后,输出问候语"Hello, "加名字 Input 一个英文名字 ...

  10. jackson转换json大写_jackson json序列化 首字母大写 第二个字母需小写

    有这样一个类: @Setter @Getter @JsonNaming(value= PropertyNamingStrategy.UpperCamelCaseStrategy.class)publi ...

最新文章

  1. 2014年云计算服务将取代PC电脑
  2. 操作系统 综合应用题知识点更新【章节考试重点(进程同步、处理机调度与死锁、存储管理、设备管理、文件管理)】
  3. magic square java_测试Magic Square Java的.txt文件
  4. fastclick源码简析
  5. 使用 CSS 模拟鼠标点击交互
  6. c语言 怎么把数据存储,急求如何将下列C语言程序数据存储到文件中?
  7. DMA映射 dma_addr_t
  8. mathematic语法基础
  9. 百度网盘提取码_百度网盘无提取码分享方法
  10. 银河麒麟ARM64 飞腾FT2000 linuxdeployqt linux打包qt
  11. 国稻种芯百团计划行动 胡培松:早稻可以向用途多元化发展
  12. word如何插入目录
  13. 测试设计之状态转换图
  14. linux屏幕怎么暗一点,Ubuntu 12.10 调节屏幕亮度经验分享
  15. 记录下如何用vue实现PC端网易云轮播图效果
  16. 2019人工智能技术发展趋势
  17. 国企面试-260题-单选题 下列哪组成语反映了同一种人际关系: A 琴瑟和鸣 破镜重圆 B 负荆请罪 载舟覆舟 C 结草衔环 青梅竹马 D 相濡以沫 舐犊情深
  18. 一文看懂大数据矩阵运算利器-Spark Distributed Matrix
  19. Android AccountManager 账户同步管理简单介绍
  20. Git冲突解决: git checkout高级用法

热门文章

  1. mysql改列名_mysql怎么修改列名
  2. 笔记本电脑频繁自动重启_如何解决电脑频繁自动重启
  3. 【系统分析师之路】第十一章 系统分析师之期中测试(章节重点)
  4. 根号二怎么不用计算机算,[转载]开根号,不用计算器你会么?
  5. 常微分二阶线性齐次微分方程的通解推导
  6. STM32单片机基础知识总结(二)
  7. 采用运放构成的串联稳压电源及可调恒流源电路图
  8. 上海房屋租赁合同登记备案证明办理流程
  9. 【贝尔链创始人Vincent: 区块链不仅是技术革命 更是认知革命】
  10. DER: Dynamically Expandable Representation for Class Incremental Learning翻译