亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 org.w3c.dom.Element 將 java 對象轉換為字符串,并在轉換回來時出錯

使用 org.w3c.dom.Element 將 java 對象轉換為字符串,并在轉換回來時出錯

尚方寶劍之說 2022-08-17 15:20:39
我有包裝類:@Data@NoArgsConstructor@AllArgsConstructorpublic class Wrapper {    private String id;    private int number;    private Element internal;}我有內部類:@XmlRootElement@Data@AllArgsConstructor@NoArgsConstructorpublic class Payment {    private BigDecimal amount;    private String account;}我創建 ,將其轉換為 并設置為 .之后,我將包裝器轉換為字符串,使用Json JacksonPaymentorg.w3c.dom.ElementWrapper之后,我嘗試以另一種方式轉換 - 字符串到對象并得到錯誤。public class Main {    public static void main(String[] args) throws JAXBException, ParserConfigurationException, IOException {        ObjectMapper mapper = new ObjectMapper();        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();        JAXBContext context = JAXBContext.newInstance(Payment.class);        Marshaller marshaller = context.createMarshaller();        //create paymant        Payment payment = new Payment(BigDecimal.valueOf(100), "666");        //convert to Element        marshaller.marshal(payment, document);        Element element = document.getDocumentElement();        //set Paymant as Element to Wrapper        Wrapper wrapper = new Wrapper("123321", 987, element);        //convert Wrapper to string        String wrapperAsString = mapper.writeValueAsString(wrapper);        System.out.println(wrapperAsString);        //convert the other way        Wrapper restoreWrapper = mapper.readValue(wrapperAsString, Wrapper.class);    }}當我將包裝器轉換為字符串時,我得到這個結果:{    "id": "123321",    "number": 987,    "internal": "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<payment><account>666</account><amount>100</amount></payment>"}
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

您有兩種選擇:

  1. 將類型更改為 或 。internalDocumentNode

  2. 編寫自定義 deserialiser,它將在行中執行與您相同的操作:Element element = document.getDocumentElement();

Custom deserialiser:

class ElementDeserializer extends DOMDeserializer<Element> {


    private static final long serialVersionUID = 1L;


    public ElementDeserializer() {

        super(Element.class);

    }


    @Override

    public Element _deserialize(String value, DeserializationContext ctxt)

        throws IllegalArgumentException {

        return parse(value).getDocumentElement();

    }

}

您可以按如下方式注冊:


SimpleModule elementModule = new SimpleModule();

elementModule.addDeserializer(Element.class, new ElementDeserializer());


ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(elementModule);

但我建議留在定制的除甲醚 - 和 - .Documencom.fasterxml.jackson.databind.ext.DOMDeserializer.DocumentDeserializerNodecom.fasterxml.jackson.databind.ext.DOMDeserializer.NodeDeserializer


查看完整回答
反對 回復 2022-08-17
  • 1 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號