From 510a03ac3609bd226c094f716fce74a44c64c663 Mon Sep 17 00:00:00 2001 From: Pratik Tiwari Date: Sat, 31 Jan 2026 10:32:09 +0530 Subject: [PATCH] Fixes #1040, Aligns non-forceList behaviour with forceList --- src/main/java/org/json/XML.java | 6 ++ .../org/json/junit/XMLConfigurationTest.java | 63 ++++++++++++++++--- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/json/XML.java b/src/main/java/org/json/XML.java index 539285d..7e4b0bb 100644 --- a/src/main/java/org/json/XML.java +++ b/src/main/java/org/json/XML.java @@ -393,6 +393,11 @@ public class XML { context.append(tagName, jsonObject); } else if(context.isEmpty()) { //avoids resetting the array in case of an empty tag in the middle or end context.put(tagName, new JSONArray()); + if (jsonObject.isEmpty()){ + context.append(tagName, ""); + } + } else { + context.append(tagName, ""); } } else { if (nilAttributeFound) { @@ -455,6 +460,7 @@ public class XML { if(context.isEmpty()) { context.put(tagName, new JSONArray()); } + context.append(tagName, ""); } else if (jsonObject.length() == 1 && jsonObject.opt(config.getcDataTagName()) != null) { context.append(tagName, jsonObject.opt(config.getcDataTagName())); diff --git a/src/test/java/org/json/junit/XMLConfigurationTest.java b/src/test/java/org/json/junit/XMLConfigurationTest.java index 8edbe79..e8ff3b6 100755 --- a/src/test/java/org/json/junit/XMLConfigurationTest.java +++ b/src/test/java/org/json/junit/XMLConfigurationTest.java @@ -1092,7 +1092,7 @@ public class XMLConfigurationTest { ""; String expectedStr = - "{\"addresses\":[]}"; + "{\"addresses\":[\"\"]}"; Set forceList = new HashSet(); forceList.add("addresses"); @@ -1130,7 +1130,7 @@ public class XMLConfigurationTest { ""; String expectedStr = - "{\"addresses\":[]}"; + "{\"addresses\":[\"\"]}"; Set forceList = new HashSet(); forceList.add("addresses"); @@ -1147,7 +1147,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithLastElementAsEmptyTag(){ final String originalXml = "1"; - final String expectedJsonString = "{\"root\":{\"id\":[1]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[1,\"\"]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1163,7 +1163,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithFirstElementAsEmptyTag(){ final String originalXml = "1"; - final String expectedJsonString = "{\"root\":{\"id\":[1]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[\"\",1]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1179,7 +1179,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithMiddleElementAsEmptyTag(){ final String originalXml = "12"; - final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[1,\"\",2]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1195,8 +1195,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithLastElementAsEmpty(){ final String originalXml = "1"; - final String expectedJsonString = "{\"root\":{\"id\":[1]}}"; - + final String expectedJsonString = "{\"root\":{\"id\":[1,\"\"]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); final JSONObject json = XML.toJSONObject(originalXml, @@ -1210,7 +1209,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithFirstElementAsEmpty(){ final String originalXml = "1"; - final String expectedJsonString = "{\"root\":{\"id\":[1]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[\"\",1]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1225,7 +1224,7 @@ public class XMLConfigurationTest { @Test public void testForceListWithMiddleElementAsEmpty(){ final String originalXml = "12"; - final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[1,\"\",2]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1240,7 +1239,7 @@ public class XMLConfigurationTest { @Test public void testForceListEmptyAndEmptyTagsMixed(){ final String originalXml = "12"; - final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}"; + final String expectedJsonString = "{\"root\":{\"id\":[\"\",\"\",1,\"\",\"\",2]}}"; HashSet forceListCandidates = new HashSet<>(); forceListCandidates.add("id"); @@ -1252,6 +1251,50 @@ public class XMLConfigurationTest { assertEquals(expectedJsonString, json.toString()); } + @Test + public void testForceListConsistencyWithDefault() { + final String originalXml = "01"; + final String expectedJsonString = "{\"root\":{\"id\":[0,1,\"\",\"\"]}}"; + + // confirm expected result of default array-of-tags processing + JSONObject json = XML.toJSONObject(originalXml); + assertEquals(expectedJsonString, json.toString()); + + // confirm forceList array-of-tags processing is consistent with default processing + HashSet forceListCandidates = new HashSet<>(); + forceListCandidates.add("id"); + json = XML.toJSONObject(originalXml, + new XMLParserConfiguration() + .withForceList(forceListCandidates)); + assertEquals(expectedJsonString, json.toString()); + } + + @Test + public void testForceListInitializesAnArrayWithAnEmptyElement(){ + final String originalXml = ""; + final String expectedJsonString = "{\"root\":{\"id\":[\"\"]}}"; + + HashSet forceListCandidates = new HashSet<>(); + forceListCandidates.add("id"); + JSONObject json = XML.toJSONObject(originalXml, + new XMLParserConfiguration() + .withForceList(forceListCandidates)); + assertEquals(expectedJsonString, json.toString()); + } + + @Test + public void testForceListInitializesAnArrayWithAnEmptyTag(){ + final String originalXml = ""; + final String expectedJsonString = "{\"root\":{\"id\":[\"\"]}}"; + + HashSet forceListCandidates = new HashSet<>(); + forceListCandidates.add("id"); + JSONObject json = XML.toJSONObject(originalXml, + new XMLParserConfiguration() + .withForceList(forceListCandidates)); + assertEquals(expectedJsonString, json.toString()); + } + @Test public void testMaxNestingDepthIsSet() { XMLParserConfiguration xmlParserConfiguration = XMLParserConfiguration.ORIGINAL;