diff --git a/pom.xml b/pom.xml index e28a054..32934e4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ reedelk-openapi com.reedelk - 1.0.2-SNAPSHOT + 1.0.2 20190722 diff --git a/src/main/java/com/reedelk/openapi/commons/DataFormat.java b/src/main/java/com/reedelk/openapi/commons/DataFormat.java index 56ab6cb..a548b9b 100644 --- a/src/main/java/com/reedelk/openapi/commons/DataFormat.java +++ b/src/main/java/com/reedelk/openapi/commons/DataFormat.java @@ -1,10 +1,10 @@ package com.reedelk.openapi.commons; +import org.json.JSONArray; import org.json.JSONObject; import org.yaml.snakeyaml.Yaml; -import java.util.HashMap; -import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; public enum DataFormat { @@ -34,20 +34,24 @@ public boolean is(String dataAsString) { try { new JSONObject(dataAsString); return true; - } catch (Exception exception) { - return false; + } catch (Exception ignore) { + // not a JSON object + } + try { + new JSONArray(dataAsString); + return true; + } catch (Exception ignore) { + // not a JSON array } + return false; } - @SuppressWarnings("unchecked") @Override public String dump(Object object) { - // If the input object is a linked has map we must create a new HashMap, - // otherwise the JSON object does not serialize correctly. - if (object instanceof LinkedHashMap) { - Map map = new HashMap<>(); - ((Map) object).forEach(map::put); - return new JSONObject(map).toString(2); + if (object instanceof List) { + return new JSONArray((List) object).toString(2); + } else if (object instanceof Map) { + return new JSONObject((Map) object).toString(2); } else { return new JSONObject(object).toString(2); } diff --git a/src/test/java/com/reedelk/openapi/commons/DataFormatTest.java b/src/test/java/com/reedelk/openapi/commons/DataFormatTest.java new file mode 100644 index 0000000..882794a --- /dev/null +++ b/src/test/java/com/reedelk/openapi/commons/DataFormatTest.java @@ -0,0 +1,78 @@ +package com.reedelk.openapi.commons; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; +import static org.skyscreamer.jsonassert.JSONCompareMode.STRICT; + +class DataFormatTest { + + @Test + void shouldCorrectlyDumpLinkedHashMapObject() { + // Given + Map shipment = new LinkedHashMap<>(); + shipment.put("id", "aabbcc"); + shipment.put("details", "FedEx"); + + // When + String jsonData = DataFormat.JSON.dump(shipment); + + // Then + assertEquals("{\n" + + " \"details\": \"FedEx\",\n" + + " \"id\": \"aabbcc\"\n" + + "}", jsonData, STRICT); + } + + @Test + void shouldCorrectlyDumpLinkedHashMapObjectWithNestedMap() { + // Given + Map shipmentDetails = new LinkedHashMap<>(); + shipmentDetails.put("carrier", "FedEx"); + shipmentDetails.put("time", "Morning"); + + Map shipment = new LinkedHashMap<>(); + shipment.put("id", "aabbcc"); + shipment.put("details", shipmentDetails); + + // When + String jsonData = DataFormat.JSON.dump(shipment); + + // Then + assertEquals("{\n" + + " \"details\": {\n" + + " \"carrier\": \"FedEx\",\n" + + " \"time\": \"Morning\"\n" + + " },\n" + + " \"id\": \"aabbcc\"\n" + + "}", jsonData, STRICT); + } + + @Test + void shouldCorrectlyDumpArrayAsJson() { + // Given + Map shipment1Details = new LinkedHashMap<>(); + shipment1Details.put("carrier", "FedEx"); + + Map shipment1 = new LinkedHashMap<>(); + shipment1.put("id", "aabbcc"); + shipment1.put("details", shipment1Details); + + List> shipments = new ArrayList<>(); + shipments.add(shipment1); + + // When + String jsonData = DataFormat.JSON.dump(shipments); + + // Then + assertEquals("[{\n" + + " \"details\": {\"carrier\": \"FedEx\"},\n" + + " \"id\": \"aabbcc\"\n" + + "}]", jsonData, STRICT); + } +}