字串型別的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);
注意事項
- xml內容不能有轉義字元,否則在反序列化會報錯;
@XmlRootElement
在請求類加註釋,表示為根節點;@XmlAccessorType
用了這個之後就會自動忽略setter/getter方法。不用這個就需要去掉註解,需要保證屬性名和xml裡的表簽名一致;@XmlElement(name = "batch")
表明節點,name
需要和節點名一致;@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物件排序問題(字串轉map,map轉字串)
背景 記錄專案中遇到的 關於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