diff --git a/src/main/java/org/json/XML.java b/src/main/java/org/json/XML.java
index e14bb34..d0216f5 100644
--- a/src/main/java/org/json/XML.java
+++ b/src/main/java/org/json/XML.java
@@ -391,7 +391,7 @@ public class XML {
context.append(tagName, JSONObject.NULL);
} else if (jsonObject.length() > 0) {
context.append(tagName, jsonObject);
- } else {
+ } else if(context.isEmpty() && (context.opt(tagName) == null || !(context.get(tagName) instanceof JSONArray))) { //avoids resetting the array in case of an empty tag in the middle or end
context.put(tagName, new JSONArray());
}
} else {
@@ -451,7 +451,10 @@ public class XML {
if (config.getForceList().contains(tagName)) {
// Force the value to be an array
if (jsonObject.length() == 0) {
- context.put(tagName, new JSONArray());
+ //avoids resetting the array in case of an empty element in the middle or end
+ if(context.length()==0 && context.opt(tagName) == null || !(context.get(tagName) instanceof JSONArray)) {
+ context.put(tagName, new JSONArray());
+ }
} 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 ca1980c..8edbe79 100755
--- a/src/test/java/org/json/junit/XMLConfigurationTest.java
+++ b/src/test/java/org/json/junit/XMLConfigurationTest.java
@@ -1144,6 +1144,114 @@ public class XMLConfigurationTest {
Util.compareActualVsExpectedJsonObjects(jsonObject, expetedJsonObject);
}
+ @Test
+ public void testForceListWithLastElementAsEmptyTag(){
+ final String originalXml = "1";
+ final String expectedJsonString = "{\"root\":{\"id\":[1]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withcDataTagName("content")
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListWithFirstElementAsEmptyTag(){
+ final String originalXml = "1";
+ final String expectedJsonString = "{\"root\":{\"id\":[1]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withcDataTagName("content")
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListWithMiddleElementAsEmptyTag(){
+ final String originalXml = "12";
+ final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withcDataTagName("content")
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListWithLastElementAsEmpty(){
+ final String originalXml = "1";
+ final String expectedJsonString = "{\"root\":{\"id\":[1]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListWithFirstElementAsEmpty(){
+ final String originalXml = "1";
+ final String expectedJsonString = "{\"root\":{\"id\":[1]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListWithMiddleElementAsEmpty(){
+ final String originalXml = "12";
+ final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
+ @Test
+ public void testForceListEmptyAndEmptyTagsMixed(){
+ final String originalXml = "12";
+ final String expectedJsonString = "{\"root\":{\"id\":[1,2]}}";
+
+ HashSet forceListCandidates = new HashSet<>();
+ forceListCandidates.add("id");
+ final JSONObject json = XML.toJSONObject(originalXml,
+ new XMLParserConfiguration()
+ .withKeepStrings(false)
+ .withForceList(forceListCandidates)
+ .withConvertNilAttributeToNull(true));
+ assertEquals(expectedJsonString, json.toString());
+ }
+
@Test
public void testMaxNestingDepthIsSet() {
XMLParserConfiguration xmlParserConfiguration = XMLParserConfiguration.ORIGINAL;