From 06a33e4f8581a879791b1a8343bfc5ac8931f58a Mon Sep 17 00:00:00 2001 From: "i.maragkopoulos" Date: Thu, 8 Apr 2021 16:42:57 +0300 Subject: [PATCH] Handle duplicate elements as Array when converting XML to JSON --- .../DuplicateToArrayJsonNodeDeserializer.java | 29 +++++++++++++++++++ .../rest/sdk/wrapper/utils/Utils.java | 6 ++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/DuplicateToArrayJsonNodeDeserializer.java diff --git a/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/DuplicateToArrayJsonNodeDeserializer.java b/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/DuplicateToArrayJsonNodeDeserializer.java new file mode 100644 index 0000000..22448a2 --- /dev/null +++ b/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/DuplicateToArrayJsonNodeDeserializer.java @@ -0,0 +1,29 @@ +package com.paymentcomponents.libraries.rest.sdk.wrapper.utils; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class DuplicateToArrayJsonNodeDeserializer extends JsonNodeDeserializer { + + @Override + protected void _handleDuplicateField(JsonParser p, DeserializationContext ctxt, + JsonNodeFactory nodeFactory, String fieldName, ObjectNode objectNode, + JsonNode oldValue, JsonNode newValue) throws JsonProcessingException { + ArrayNode node; + if (oldValue instanceof ArrayNode) { + node = (ArrayNode) oldValue; + node.add(newValue); + } else { + node = nodeFactory.arrayNode(); + node.add(oldValue); + node.add(newValue); + } + objectNode.set(fieldName, node); + } +} \ No newline at end of file diff --git a/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/Utils.java b/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/Utils.java index 7b62c2d..ebd0d74 100644 --- a/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/Utils.java +++ b/src/main/java/com/paymentcomponents/libraries/rest/sdk/wrapper/utils/Utils.java @@ -1,6 +1,7 @@ package com.paymentcomponents.libraries.rest.sdk.wrapper.utils; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import javax.xml.datatype.DatatypeConfigurationException; @@ -17,11 +18,16 @@ public static String convertXmlToJson(String xml, String additionalRootElement) String json = ""; try { XmlMapper xmlMapper = new XmlMapper(); + xmlMapper.registerModule(new SimpleModule().addDeserializer( + JsonNode.class, + new DuplicateToArrayJsonNodeDeserializer() + )); JsonNode node = xmlMapper.readTree(xml.getBytes()); json = node.toString(); if (additionalRootElement != null && !additionalRootElement.isEmpty()) { json = "{ \"" + additionalRootElement + "\": " + json + " } "; } + json = json.replaceAll("\"\":", "\"Value\":"); } catch (Exception e) { e.printStackTrace(); }