From cfa0c91b191461be52a97249115ea71eae0c04bb Mon Sep 17 00:00:00 2001 From: John Lindal Date: Wed, 1 Jun 2011 00:06:22 +0000 Subject: [PATCH] WW-3489 if excludeNullProperties, ignore nulls in maps git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@1129976 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/struts2/json/JSONWriter.java | 24 ++++++----- .../apache/struts2/json/JSONWriterTest.java | 40 +++++++++++++++++++ .../struts2/json/jsonwriter-write-bean-03.txt | 13 ++++++ 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 plugins/json/src/test/resources/org/apache/struts2/json/jsonwriter-write-bean-03.txt diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java index 8e588843a..9022695d0 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONWriter.java @@ -342,18 +342,18 @@ class JSONWriter { * Add name/value pair to buffer */ private boolean add(String name, Object value, Method method, boolean hasData) throws JSONException { - if (!excludeNullProperties || (value != null)) { - if (hasData) { - this.add(','); - } - this.add('"'); - this.add(name); - this.add("\":"); - this.value(value, method); - return true; + if (excludeNullProperties && value == null) { + return false; } - return false; + if (hasData) { + this.add(','); + } + this.add('"'); + this.add(name); + this.add("\":"); + this.value(value, method); + return true; } /** @@ -368,6 +368,10 @@ class JSONWriter { boolean hasData = false; while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); + if (excludeNullProperties && entry.getValue() == null) { + continue; + } + Object key = entry.getKey(); String expr = null; if (this.buildExpr) { diff --git a/plugins/json/src/test/java/org/apache/struts2/json/JSONWriterTest.java b/plugins/json/src/test/java/org/apache/struts2/json/JSONWriterTest.java index fde5539f9..4ae12b0d6 100644 --- a/plugins/json/src/test/java/org/apache/struts2/json/JSONWriterTest.java +++ b/plugins/json/src/test/java/org/apache/struts2/json/JSONWriterTest.java @@ -5,6 +5,8 @@ import org.apache.struts2.json.annotations.JSONFieldBridge; import org.apache.struts2.json.bridge.StringBridge; import org.junit.Test; +import java.util.Map; +import java.util.LinkedHashMap; import java.net.URL; public class JSONWriterTest extends StrutsTestCase{ @@ -27,6 +29,44 @@ public class JSONWriterTest extends StrutsTestCase{ TestUtils.assertEquals(JSONWriter.class.getResource("jsonwriter-write-bean-01.txt"), json); } + @Test + public void testWriteExcludeNull() throws Exception { + BeanWithMap bean1=new BeanWithMap(); + bean1.setStringField("str"); + bean1.setBooleanField(true); + bean1.setCharField('s'); + bean1.setDoubleField(10.1); + bean1.setFloatField(1.5f); + bean1.setIntField(10); + bean1.setLongField(100); + bean1.setEnumField(AnEnum.ValueA); + bean1.setEnumBean(AnEnumBean.Two); + + Map m = new LinkedHashMap(); + m.put("a", "x"); + m.put("b", null); + m.put("c", "z"); + bean1.setMap(m); + + JSONWriter jsonWriter = new JSONWriter(); + jsonWriter.setEnumAsBean(false); + jsonWriter.setIgnoreHierarchy(false); + String json = jsonWriter.write(bean1, null, null, true); + TestUtils.assertEquals(JSONWriter.class.getResource("jsonwriter-write-bean-03.txt"), json); + } + + private class BeanWithMap extends Bean{ + private Map map; + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + } + @Test public void testWriteAnnotatedBean() throws Exception { AnnotatedBean bean1=new AnnotatedBean(); diff --git a/plugins/json/src/test/resources/org/apache/struts2/json/jsonwriter-write-bean-03.txt b/plugins/json/src/test/resources/org/apache/struts2/json/jsonwriter-write-bean-03.txt new file mode 100644 index 000000000..9a2da6910 --- /dev/null +++ b/plugins/json/src/test/resources/org/apache/struts2/json/jsonwriter-write-bean-03.txt @@ -0,0 +1,13 @@ +{ + "booleanField":true, + "byteField":0, + "charField":"s", + "doubleField":10.1, + "enumBean":"Two", + "enumField":"ValueA", + "floatField":1.5, + "intField":10, + "longField":100, + "map":{"a":"x","c":"z"}, + "stringField":"str" +}