gpt4 book ai didi

java - 将带有 org.w3c.dom.Element 的 java 对象转换为字符串,并在转换回来时出现错误

转载 作者:行者123 更新时间:2023-11-30 05:43:39 26 4
gpt4 key购买 nike

我有包装类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Wrapper {
private String id;
private int number;
private Element internal;
}

我有内部类(class):

@XmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment {
private BigDecimal amount;
private String account;
}

我创建 Payment,将其转换为 org.w3c.dom.Element 并设置为 Wrapper。之后我将 Wrapper 转换为字符串 使用 Json Jackson

之后我尝试以另一种方式转换 - 字符串到对象并得到错误。

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);

}
}

当我将 Wrapper 转换为 String 时,我得到以下结果:

{
"id": "123321",
"number": 987,
"internal": "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<payment><account>666</account><amount>100</amount></payment>"
}

但是当以其他方式转换时我会遇到异常:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Problem deserializing property 'internal' (expected type: [simple type, class org.w3c.dom.Element]; actual type: `com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl`), problem: argument type mismatch
at [Source: (String)"{"id":"123321","number":987,"internal":"<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<payment><account>666</account><amount>100</amount></payment>"}"; line: 1, column: 40] (through reference chain: com.pavel.Wrapper["internal"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:278)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:597)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:141)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
at com.pavel.Main.main(Main.java:36)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:139)

最佳答案

您有两个选择:

  1. 更改internal输入 DocumentNode .
  2. 编写自定义反序列化器,其作用与您在行中的相同:Element element = document.getDocumentElement() ;

自定义反序列化器:

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);

但我建议继续使用自定义反序列化器 Documen -com.fasterxml.jackson.databind.ext.DOMDeserializer.DocumentDeserializerNode -com.fasterxml.jackson.databind.ext.DOMDeserializer.NodeDeserializer .

关于java - 将带有 org.w3c.dom.Element 的 java 对象转换为字符串,并在转换回来时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55217671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com