Jackson 不应忽略多根 xml 内容中的根元素标记

问题描述

我有以下 xml 内容,我想将其反序列化为 JSON,

输入内容

<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 库获得预期输出吗?谢谢。

解决方法

试试这个,我用过

 <dependency>
   <groupId>org.json</groupId>
   <artifactId>json</artifactId>
   <version>20140107</version>
 </dependency>

import org.json.*;

public class ConvertXML {
public static String xml = "<TransmissionAck>\r\n" + "    <EchoedTransmissionHeader>\r\n"
        + "        <TransmissionHeader>\r\n"
        + "            <ReferenceTransmissionNo>26218</ReferenceTransmissionNo>\r\n"
        + "        </TransmissionHeader>\r\n" + "    </EchoedTransmissionHeader>\r\n" + "</TransmissionAck>";

public static void main(String[] args) {
    try {
        JSONObject json = XML.toJSONObject(xml);
        String jsonString = json.toString(4);
        System.out.println(jsonString);

    } catch (JSONException e) {
        System.out.println(e.toString());
    }

 }
}