【发布时间】:2021-07-11 18:29:44
【问题描述】:
我有以下要反序列化为 JSON 的 xml 内容,
输入内容
<TransmissionAck>
<EchoedTransmissionHeader>
<TransmissionHeader>
<ReferenceTransmissionNo>26218</ReferenceTransmissionNo>
</TransmissionHeader>
</EchoedTransmissionHeader>
</TransmissionAck>
预期输出
{
"TransmissionAck": {
"EchoedTransmissionHeader":{
"TransmissionHeader":{
"ReferenceTransmissionNo":"26177"
}
}
}
}
实际输出
{
"EchoedTransmissionHeader":{
"EchoedTransmissionHeader":{
"TransmissionHeader":{
"ReferenceTransmissionNo":"26177"
}
}}}
我正在从 RestController(Spring Boot) 传递动态内容
Mono<ResponseEntity<String>> otmXmlResponse = webRequestsService
.handlePost(Files.readString(Paths.get(outputFile.getAbsolutePath()), StandardCharsets.US_ASCII));
String body = otmXmlResponse.block().getBody();
String r = testXmlResponse(body);
============
public <T> T testXmlResponse(String xml) throws JsonMappingException, JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(new SimpleModule().addDeserializer(JsonNode.class,
new JsonNodeDeserializer() {
private static final long serialVersionUID = -5947022035338738709L;
public JsonNode deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
XMLStreamReader xmlP = ((FromXmlParser) p).getStaxReader();
String rootName = xmlP.getLocalName().toString();
return ctxt.getNodeFactory().objectNode().set(rootName, super.deserialize(p, ctxt));
}
}));
JsonNode entries = xmlMapper.readTree(inputFile);
String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(entries);
return (T) json;
}
当我运行单元测试时,我得到了预期的输出,但是当我使用来自控制器的动态内容调用上述反序列化方法时,子根元素被视为根。我不能使用 POJO 进行映射。知道如何使用 Jackson 库获得预期的输出吗?谢谢。
【问题讨论】:
标签: java jackson jackson-dataformat-xml