Если ваша XML-схема проста, достаточно конвертировать «true / false» в «boolean» и «number» в «long».У меня есть решение.
После JsonNode node = xmlMapper.readTree(xmlMsg.getBytes());
потомки node
имеют тип TextNode
.Вы можете перемещать node
объект и конвертировать TextNode
в BooleanNode
или LongNode
, если значение соответствует определенным условиям.
Добавьте следующий метод:
public static JsonNode resolveType(JsonNode jsonNode) {
if (jsonNode instanceof ObjectNode) {
ObjectNode objectNode = (ObjectNode) jsonNode;
Iterator<Entry<String, JsonNode>> fields = objectNode.fields();
while (fields.hasNext()) {
Entry<String, JsonNode> next = fields.next();
next.setValue(resolveType(next.getValue()));
}
} else if (jsonNode instanceof TextNode) {
TextNode textNode = (TextNode) jsonNode;
String value = textNode.textValue();
if ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value)) {
jsonNode = BooleanNode.valueOf(Boolean.valueOf(value));
} else if (StringUtils.isNumeric(value)) {
jsonNode = LongNode.valueOf(Long.valueOf(value));
}
}
return jsonNode;
}
Затем используйтеэтот метод для разрешения типа JsonNode node
:
JsonNode node = xmlMapper.readTree(xmlMsg.getBytes());
node = resolveType(node); // <--- Add this statement to your code.
ObjectMapper jsonMapper = new ObjectMapper();
//...
Выходные данные должны быть ожидаемыми JSON:
{"id":333,"type":"Text","flag":true}