【问题标题】:Jackson should not ignore root element tag in multi root xml contentJackson 不应忽略多根 xml 内容中的根元素标记
【发布时间】: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


    【解决方案1】:

    试试这个,我用过

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2018-03-22
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      相关资源
      最近更新 更多