问题描述
输入内容
<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());
}
}
}