1. 程式人生 > >字串型別的xml資料,反序列化為自定義的實體類

字串型別的xml資料,反序列化為自定義的實體類

應用場景

lz最近在開發一個介面,需要接收xml型別的資料,然後對接收到的資料進行業務處理。
關於如何從請求中接收資料,CSDN上有很多文章。
再次只介紹下,我是如何把接收到的xml字串轉化為實體類的,大家有不同見解,歡迎給予建議。

準備以及實現

1.xml資料
批次(一個請求中可以存在多個批次)batch
批次編號batchCode
訂單(一個批次號中可以存在多個訂單)soOrder
訂單編碼orderCode
列印順序printOrder

<?xml version="1.0" encoding="utf-8"?>
<request> <batchs> <batch> <batchCode>22</batchCode> <soOrders> <soOrder> <orderCode>80000002866</orderCode> <printOrder>10</printOrder> </soOrder> <soOrder> <orderCode>08011801407</orderCode> <printOrder>11</printOrder
>
</soOrder> </soOrders> </batch> <batch> <batchCode>33</batchCode> <soOrders> <soOrder> <orderCode>08011801435</orderCode> <printOrder>10</printOrder> </soOrder> <soOrder> <orderCode>08011801445</orderCode> <printOrder
>
11</printOrder> </soOrder> </soOrders> </batch> </batchs> </request>

2.序列化與反序列化工具類XmlUtils

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
 * Copyright (c) 2017. ****** All Rights Reserved.
 * 
 * @描述: TODO
 * @作者: lizy
 * @建立: 2018-2-7 下午3:56:49
 * @版本: V1.0 *
 */
public class XmlUtils {
    /**
     * 將物件直接轉換成String型別的 XML輸出
     * 
     * @param obj
     * @return
     */
    public static String convertToXml(Object obj) {
        // 建立輸出流
        StringWriter sw = new StringWriter();
        try {
            // 利用jdk中自帶的轉換類實現
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml輸出的格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            // 將物件轉換成輸出流形式的xml
            marshaller.marshal(obj, sw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return sw.toString();
    }

    /**
     * 將String型別的xml轉換成物件
     */
    public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            // 進行將Xml轉成物件的核心介面
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sr = new StringReader(xmlStr);
            xmlObject = unmarshaller.unmarshal(sr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }
}

3.相關實體類
請求類ThermOrderPrintRequest

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Copyright (c) 2017. ****** All Rights Reserved.
 * 
 * @描述: 
 * @作者: lizy
 * @建立: 2018-2-7 下午4:24:51
 * @版本: V1.0 *
 */
@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.FIELD)
public class ThermOrderPrintRequest implements Serializable{

    @XmlElementWrapper(name = "batchs")
    @XmlElement(name = "batch")
    private List<ThermOrderPrintBatch> batchs;

    public List<ThermOrderPrintBatch> getBatchs() {
        return batchs;
    }

    public void setBatchs(List<ThermOrderPrintBatch> batchs) {
        this.batchs = batchs;
    }

}

請求批次類ThermOrderPrintBatch

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Copyright (c) 2017. ***** All Rights Reserved.
 * 
 * @描述: TODO
 * @作者: lizy
 * @建立: 2018-2-7 下午4:17:10
 * @版本: V1.0 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
public class ThermOrderPrintBatch implements Serializable{

    @XmlElement(name = "batchCode")
    private String batchCode;// 批次編號

    @XmlElementWrapper(name = "soOrders")
    @XmlElement(name = "soOrder")
    private List<ThermOrderPrint> orderPrints;

    public String getBatchCode() {
        return batchCode;
    }

    public void setBatchCode(String batchCode) {
        this.batchCode = batchCode;
    }

    public List<ThermOrderPrint> getOrderPrints() {
        return orderPrints;
    }

    public void setOrderPrints(List<ThermOrderPrint> orderPrints) {
        this.orderPrints = orderPrints;
    }

}

訂單類ThermOrderPrint

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Copyright (c) 2017. ****** All Rights Reserved.
 * 
 * @描述: 
 * @作者: lizy
 * @建立: 2018-2-7 下午4:00:53
 * @版本: V1.0 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
public class ThermOrderPrint implements Serializable{

    @XmlElement(name = "orderCode")
    private String orderCode;// 訂單編碼

    @XmlElement(name = "printOrder")
    private String printOrder;// 列印順序

    public String getOrderCode() {
        return orderCode;
    }
    public void setOrderCode(String orderCode) {
        this.orderCode = orderCode;
    }
    public String getPrintOrder() {
        return printOrder;
    }
    public void setPrintOrder(String printOrder) {
        this.printOrder = printOrder;
    }

}

4.反序列化為ThermOrderPrintRequest

ThermOrderPrintRequest orderPrintRequest = (ThermOrderPrintRequest) XmlUtils
                            .convertXmlStrToObject(
                                    ThermOrderPrintRequest.class,XmlString);

注意事項

  1. xml內容不能有轉義字元,否則在反序列化會報錯;
  2. @XmlRootElement在請求類加註釋,表示為根節點;
  3. @XmlAccessorType用了這個之後就會自動忽略setter/getter方法。不用這個就需要去掉註解,需要保證屬性名和xml裡的表簽名一致;
  4. @XmlElement(name = "batch")表明節點,name需要和節點名一致;
  5. @XmlElementWrapper(name = "batchs")表示生成一個包裝 XML 表示形式的包裝器元素。 此元素主要用於生成一個包裝集合的包裝器 XML 元素;

相關推薦

字串型別的xml資料序列化為定義實體

應用場景 lz最近在開發一個介面,需要接收xml型別的資料,然後對接收到的資料進行業務處理。 關於如何從請求中接收資料,CSDN上有很多文章。 再次只介紹下,我是如何把接收到的xml字串轉化為實體類的,大家有不同見解,歡迎給予建議。 準備以及實現 1.x

Mybatis需要返回的資料引數中在資料表中沒有對應的欄位定義實體和resultmap作為返回值型別

自定義實體類:因為需要做相關記錄的統計,而表中沒有統計欄位 public class TrafficJeevesDistrictCount { //施工top5+1 按區域 private String districtInfo; private

XML序列化與序列化+定義XML註解框架XmlUtils

背景 前面一篇總結了Serializable的序列化與反序列化,現在接著總結XML。主要內容:XML基本的序列化與反序列化方法、一些注意事項、以及自定義了一個XML註解框架(簡潔程式碼,解放雙手)。 XML的序列化與反序列化 先與Serializabl

Jackson 序列化和序列定義日期格式

在Java裡的Json序列化自定義日期格式。尤其是多語言環境裡日期格式是不一樣,導致無法相容。肥話少說,直接上程式碼。原始碼如下:public final class JacksonUtils {    private JacksonUtils() {    }    /**

ByteBuf 一個用於在通訊中的資料解析傳輸組裝的定義容器

在做和硬體通訊的專案的時候,通訊的內容一般都是最基本的byte陣列,比如BLE,UART等等方式,傳遞的都是byte陣列。 移動端在接收的時候,就需要去解析byte陣列,然後從中通過拼接和或(|)以及位移等運算來得到想要的資料型別,比如說,unsignedByte,short,int,float

使用HashMap如果key是定義就必須重寫hashcode()和equals()

hashcode()和equals()都繼承於object,在Object類中的定義為:equals()方法在Object類中的定義:publicboolean equals(Object obj){    return (this== obj);}equals()的定義為:

MapReduce資料傾斜解決方案2-- 定義分割槽---二次作業

資料傾斜:大量資料湧向到一個或者幾個reduce,造成大量的reduce空閒。 解決資料傾斜方案2:自定義分割槽類---二次作業 下面以單次統計為例進行說明: 1、DataLeanMapper1 package hadoop.lean.partitioner; i

使用HashMap如果key是定義就必須重寫hashcode()和equals()。

hashcode()和equals()都繼承於object,在Object類中的定義為: equals()方法在Object類中的定義: publicboolean equals(Object obj){     return (this== obj); } eq

C# .NET XML 序列化為對象序列

amp pan str gre ucc 返回 ack HERE where XML SAMPLE: <xml> <bank_type><![CDATA[CFT]]></bank_type><cash_fe

將JSON字串序列化為指定的.NET物件型別

前言:   關於將JSON字串反序列化為指定的.NET物件型別資料常見的場景主要是關於網路請求介面,獲取到請求成功的響應資料。本篇主要講的的是如何通過使用Newtonsoft.Json中的JsonConvert.DeserializeObject<T>(string value)方法將對應的JS

spring mvc接收ajax提交的JSON數據序列化為對象

ucc clas resp 格式 字符 序列 設定 ati res 需求:spring mvc接收ajax提交的JSON數據,並反序列化為對象,代碼如下: 前臺JS代碼: //屬性要與帶轉化的對象屬性對應 var param={name:‘語文‘,price:16

【Golang】如何不序列化為前提的情況下修改ProtoBuffer某個Tag的值

刪除 tag mage msg 挑戰 客戶 Golan protobuff 直接 當你從客戶端接收到一串序列化後的數據,你需要   - 修改其中某一個標簽的值,然後把它傳遞到真正的業務數據,這樣每個業務模塊(微服務)就不需要和公共授權服務打交道了。   - 因為傳

把物件序列化為xml格式和序列

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;

Fastjson 序列序列化Map物件排序問題(字串轉mapmap轉字串

背景 記錄專案中遇到的 關於fastjson jsonobject轉string亂序,string轉jsonObject亂序問題的解決方案 fastJson issues 問題來源描述參見: https://github.com/alibaba/fastjson/issues/359

C#:Json資料序列化為Dictionary並根據關鍵字獲取指定的值

private void button1_Click(object sender, EventArgs e){//Json資料string json = "{\"dataSet\":{\"header\":{\"returnCode\":\"0\",\"errorInfo\":\"HTTP請求錯誤\",\

【Loadrunner】 java vuser 採用cmd方式呼叫python檔案執行zeromq請求和資料protobuf序列

        背景:由於第一次接觸zeromq,對其瞭解甚少,於是度娘對其原理了解一番後,就開始了接下來實踐“坑”中,首先在LR中,對於用socekt、java、c那種方式來實現,通過抓包對比,以及socekt和c語言可實現,但複雜度有點”呵呵“,而用java開發的zero

序列化工具({對實體Bean進行序列化操作.}{將字節數組序列化為實體Bean.})

fin pub 字節數 字節 工具類 ktr null pan port package com.dsj.gdbd.utils.serialize; import java.io.ByteArrayInputStream; import java.io.Byte

序列化工具({對實體Bean進行序列化操作.}{將位元組陣列序列化為實體Bean.})

package com.dsj.gdbd.utils.serialize; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; impor

將Dictionary序列化為json資料 、json資料序列化為Dictionary

貼圖   知乎:顯著提升程式設計師身心健康和工作效率的裝備有哪些? IDE: 1.Win(Visual Studio) 2.Linux(Vim,其他真的還有必要說嗎?) 3.Mac(Xco

資料byte形式備份儲存到本地檔案序列化讀取出資料恢復

前提: 需要備份的資料由介面 object轉換成byte[],備份儲存到本地檔案; 選擇本地檔案,取得資料 byte[]轉換成object,用於資料恢復。 步驟如下: 1.把物件(資料)list ( object ) 序列化並返回相應的位元組byte[] pub