Jackson 实现Json、Object、Xml 互转

  1. github 地址:https://github.com/FasterXML/jackson-dataformat-xml
<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-xml</artifactId>
	<version>2.9.5</version>
</dependency>
复制代码
  1. 使用注解
  • @JacksonXmlRootElement:指定生成xml根标签的名字

    属性: namespace,localName

  • @JacksonXmlProperty:指定包装标签名,或者指定标签内部属性名

    属性: namespace,localName,isAttribute(default: false)

  • @JacksonXmlElementWrapper:可用于指定List等集合类,外围标签名

    属性: namespace,localName,useWrapping (default:true)

  • @JacksonXmlText:指定当前这个值,没有xml标签包裹。

    属性: namespace,localName

  1. 实体类转XML

实体类

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import java.io.Serializable;

/**
 * @Author by peng .
 * @Descriptions
 * @Datetime in 2018/5/18 08:05.
 */
@Data
@JacksonXmlRootElement(localName = "request")
public class RequestXml<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    private String request;
    // isAtrribute 设为true时,该字段为根标签的属性
    @JacksonXmlProperty(isAttribute = true)
    private String service;
    @JacksonXmlProperty(isAttribute = true)
    private String method;
    @JacksonXmlProperty
    private String token;
    @JacksonXmlProperty
    private T content;
}

复制代码

工具类

public static String objectToXml(Object object) throws IOException {
    xmlMapper.setDefaultUseWrapper(false);
    /* 字段为null,自动忽略,不再序列化 */
    xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    /* 设置转换模式 */
    xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
    String resultXml = xmlMapper.writeValueAsString(object);

    return resultXml;
}
复制代码

测试

public static void test2() throws IOException {

    RequestXml<Dept> requestXml = new RequestXml<>();
    Dept dept = new Dept();
    dept.setDeptCode("12345");
    dept.setDeptName("开发部");
    requestXml.setToken("adjfa;fjlaksdjfasdfiew");
    requestXml.setContent(dept);
    requestXml.setService("DeptService");
    requestXml.setMethod("getDeptList");
    String xml = JsonUtil.objectToXml(requestXml);

    log.info(xml);
}
复制代码

输出

<request service="DeptService" method="getDeptList">
    <token>adjfa;fjlaksdjfasdfiew</token>
    <content>
    	<deptCode>12345</deptCode>
    	<deptName>开发部</deptName>
    </content>
</request>
复制代码
  1. xml转实体类
 public static <T> T xmlToObject(String xml,Class<T> clazz) throws IOException, XMLStreamException {
    xmlMapper.setDefaultUseWrapper(false);
    /* 字段为null,自动忽略,不再序列化 */
    xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    /* 设置转换模式 */
    xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
    return xmlMapper.readValue(xml, clazz);
}
复制代码

实体类

@Data
@JacksonXmlRootElement(localName = "response")
public class ResponseData {
    @JacksonXmlProperty
    private String errorCode;
    @JacksonXmlProperty
    private String errorDesc;
    @JacksonXmlProperty
    private ResponseResult result;
}

@Data
@JacksonXmlRootElement(localName = "result")
public class ResponseResult {
    @JacksonXmlProperty(localName = "lbsLocRecord")
    private List<LbsLocRecord> lbsLocRecord;
}

@Data
@JacksonXmlRootElement(localName = "lbsLocRecord")
@EqualsAndHashCode(callSuper = false)
@TableName("lbs_loc_record")
public class LbsLocRecord extends BaseEntity {
    @TableId(value = "locate_record_id", type = IdType.ID_WORKER)
    private Long locateRecordId;

    /** 终端ID */
    private String deviceId;
    /** 偏转再加密的经度坐标值 */
    private String jmx;
    /** 偏转再加密的纬度坐标值 */
    private String jmy;
    /** 经度坐标值 */
    private String lon;
    /** 纬度坐标值 */
    private String lat;
    /** 定位时间 ,格式:YYYY-MM-DD HH:MI:SS */
    private String time;
    /** 位置描述 */
    private String position;
    /** 错误编码 */
    @TableField(exist = false)
    private String errcode;
    /** 错误信息 */
    @TableField(exist = false)
    private String errmsg;
    /** 错误信息 */
    @TableField(exist = false)
    private boolean timeOut;

}

复制代码

测试类

 public static void testXmlToObject() throws IOException, XMLStreamException {
    String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>\n" +
            "  <errorCode>00000</errorCode>\n" +
            "  <errorDesc></errorDesc>\n" +
            "  <result>\n" +
            "    <lbsLocRecord>\n" +
            "      <deviceId>15054916000</deviceId>\n" +
            "      <jmx>0</jmx>\n" +
            "      <jmy>0</jmy>\n" +
            "      <lon>127.16732</lon>\n" +
            "      <lat>44.93510</lat>\n" +
            "      <time>2018-05-18 14:06:03</time>\n" +
            "      <position>黑龙江省哈尔滨市五常市金山公园五常镇金山屯;G1211/S222/亚臣路;金山大街/G1211(路口);金山水保科技园附近</position>\n" +
            "      <timeOut>false</timeOut>\n" +
            "    </lbsLocRecord>\n" +
            "    <lbsLocRecord>\n" +
            "      <deviceId>15244366000</deviceId>\n" +
            "      <jmx>0</jmx>\n" +
            "      <jmy>0</jmy>\n" +
            "      <lon>0.0</lon>\n" +
            "      <lat>0.0</lat>\n" +
            "      <errcode>9990240</errcode>\n" +
            "      <errmsg>LBMP_CALLEE_NO_EXCEPTION</errmsg>\n" +
            "      <time>2018-05-18 14:25:58</time>\n" +
            "      <position></position>\n" +
            "      <timeOut>false</timeOut>\n" +
            "    </lbsLocRecord>\n" +
            "  </result>\n" +
            "</root>\n";

    ResponseData responseData = JsonUtil.xmlToObject(xml, ResponseData.class);
    String errorCode = responseData.getErrorCode();
    if ("00000".equals(errorCode)) {
        List<LbsLocRecord> resultList = responseData.getResult().getLbsLocRecord();
        for (LbsLocRecord record : resultList){
            if (StringUtils.isBlank(record.getErrcode())){
                log.info("插入数据");
            }
        }
    }
    String string = JSON.toJSONString(responseData);
    log.info("responseString:"+ string );
    log.info("responseData:"+ JSON.parse(string));
    /*String string = JsonUtil.xmlToJson(xml);
    log.info("string:"+ string);
    log.info("object:"+ JSON.parse(string));*/
}
复制代码
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值