diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java index 3c1bf59ec..972125eee 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java @@ -215,7 +215,7 @@ public class JSONArray extends ListWrapper implements JSON, JSONGetter list = new ArrayList<>(c.size()); for (final JSON json : c) { - if (null == json && config().isIgnoreNullValue()) { + if (null == json && config().isIgnoreNullElement()) { continue; } list.add(json); @@ -245,7 +245,7 @@ public class JSONArray extends ListWrapper implements JSON, JSONGetter implements JSON, JSONGetter implements JSON, JSONGetter * 此选项主要作用于两个阶段: *
    - *
  1. Java对象或JSON字符串转为JSON时
  2. - *
  3. JSON写出或转为JSON字符串时
  4. + *
  5. Java对象或JSON字符串转为JSONObject时
  6. + *
  7. JSONObject写出或转为JSON字符串时
  8. *
*/ private boolean ignoreNullValue = true; + /** + * 是否忽略null节点,即在JSONArray中null节点是否忽略,默认false
+ * 此选项主要作用于两个阶段: + *
    + *
  1. Java对象或JSON字符串转为JSONArray时
  2. + *
  3. JSONArray写出或转为JSON字符串时
  4. + *
+ */ + private boolean ignoreNullElement = false; /** * 是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略。 */ @@ -214,6 +223,36 @@ public class JSONConfig implements Serializable { return this; } + /** + * 是否忽略null节点,即在JSONArray中null节点是否忽略,默认false
+ * 此选项主要作用于两个阶段: + *
    + *
  1. Java对象或JSON字符串转为JSONArray时
  2. + *
  3. JSONArray写出或转为JSON字符串时
  4. + *
+ * + * @return 是否忽略null节点 + */ + public boolean isIgnoreNullElement() { + return this.ignoreNullElement; + } + + /** + * 设置是否忽略null节点,即在JSONArray中null节点是否忽略,默认false
+ * 此选项主要作用于两个阶段: + *
    + *
  1. Java对象或JSON字符串转为JSONArray时
  2. + *
  3. JSONArray写出或转为JSON字符串时
  4. + *
+ * + * @param ignoreNullElement 是否忽略null节点 + * @return this + */ + public JSONConfig setIgnoreNullElement(final boolean ignoreNullElement) { + this.ignoreNullElement = ignoreNullElement; + return this; + } + /** * 是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略。 * @@ -309,6 +348,7 @@ public class JSONConfig implements Serializable { *
  • 零宽连接符:{@code \u200D}
  • *
  • 零宽无断空格:{@code \uFEFF}
  • * + * * @return 此值为{@code false},则转义,否则去除 */ public boolean isIgnoreZeroWithChar() { @@ -323,6 +363,7 @@ public class JSONConfig implements Serializable { *
  • 零宽连接符:{@code \u200D}
  • *
  • 零宽无断空格:{@code \uFEFF}
  • * + * * @param ignoreZeroWithChar 此值为{@code false},则转义,否则去除 * @return this */ diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/writer/JSONWriter.java b/hutool-json/src/main/java/org/dromara/hutool/json/writer/JSONWriter.java index 2e4b1d8f6..ca87101b2 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/writer/JSONWriter.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/writer/JSONWriter.java @@ -23,10 +23,10 @@ import org.dromara.hutool.core.regex.ReUtil; import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; -import org.dromara.hutool.json.support.InternalJSONUtil; import org.dromara.hutool.json.JSON; import org.dromara.hutool.json.JSONConfig; import org.dromara.hutool.json.JSONException; +import org.dromara.hutool.json.support.InternalJSONUtil; import org.dromara.hutool.json.support.JSONFormatStyle; import java.io.Closeable; @@ -198,10 +198,6 @@ public class JSONWriter implements Appendable, Flushable, Closeable { */ @SuppressWarnings("resource") public JSONWriter writeField(final MutableEntry pair) { - if (null == pair.getValue() && config.isIgnoreNullValue()) { - return this; - } - if (null != predicate) { if (!predicate.test(pair)) { // 使用修改后的键值对 @@ -210,14 +206,22 @@ public class JSONWriter implements Appendable, Flushable, Closeable { } final Object key = pair.getKey(); + final Object value = pair.getValue(); + if (key instanceof Integer) { + if(null == value && config.isIgnoreNullElement()){ + return this; + } // 数组模式,只写出值 - return writeValueDirect(pair.getValue(), true); + return writeValueDirect(value, true); } + if(null == value && config.isIgnoreNullValue()){ + return this; + } // 键值对模式 writeKey(StrUtil.toString(key)); - return writeValueDirect(pair.getValue(), false); + return writeValueDirect(value, false); } /** diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java index b416d57df..b89839ac4 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONArrayTest.java @@ -60,7 +60,7 @@ public class JSONArrayTest { @Test public void addNullTest() { final List aaa = ListUtil.view("aaa", null); - final String jsonStr = JSONUtil.toJsonStr(JSONUtil.parse(aaa, JSONConfig.of().setIgnoreNullValue(false))); + final String jsonStr = JSONUtil.toJsonStr(JSONUtil.parse(aaa, JSONConfig.of().setIgnoreNullElement(false))); assertEquals("[\"aaa\",null]", jsonStr); } @@ -186,7 +186,7 @@ public class JSONArrayTest { @Test public void toListWithNullTest() { final String json = "[null,{'akey':'avalue','bkey':'bvalue'}]"; - final JSONArray ja = JSONUtil.parseArray(json, JSONConfig.of().setIgnoreNullValue(false)); + final JSONArray ja = JSONUtil.parseArray(json, JSONConfig.of().setIgnoreNullElement(false)); final List list = ja.toList(KeyBean.class); Assertions.assertNull(list.get(0)); @@ -239,12 +239,12 @@ public class JSONArrayTest { @Test public void putToIndexTest() { - JSONArray jsonArray = new JSONArray(); + JSONArray jsonArray = new JSONArray(JSONConfig.of().setIgnoreNullElement(true)); jsonArray.setValue(3, "test"); - // 默认忽略null值,因此空位无值,只有一个值 + // 忽略null值,因此空位无值,只有一个值 assertEquals(1, jsonArray.size()); - jsonArray = new JSONArray(JSONConfig.of().setIgnoreNullValue(false)); + jsonArray = new JSONArray(JSONConfig.of().setIgnoreNullElement(false)); jsonArray.setValue(2, "test"); // 第三个位置插入值,0~2都是null assertEquals(3, jsonArray.size()); @@ -299,7 +299,7 @@ public class JSONArrayTest { @Test public void putNullTest() { - final JSONArray array = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)); + final JSONArray array = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullElement(false)); array.addNull(); assertEquals("[null]", array.toString()); diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java index 6a6fd8dcf..f37563bbc 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONNullTest.java @@ -62,11 +62,11 @@ public class JSONNullTest { @Test public void setNullOfJSONArrayTest(){ // 忽略null - String json1 = JSONUtil.ofArray().addNull().toString(); + String json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullElement(true)).addNull().toString(); Assertions.assertEquals("[]", json1); // 不忽略null - json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)).addNull().toString(); + json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullElement(false)).addNull().toString(); Assertions.assertEquals("[null]", json1); } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java index 252bc7b98..249f1171e 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/JSONUtilTest.java @@ -360,7 +360,7 @@ public class JSONUtilTest { */ @Test public void testArrayEntity() { - final String jsonStr = JSONUtil.toJsonStr(new ArrayEntity()); + final String jsonStr = JSONUtil.toJsonStr(new ArrayEntity(), JSONConfig.of().setIgnoreNullElement(true)); // a为空的bytes数组,按照空的流对待 assertEquals("{\"a\":[],\"b\":[0],\"c\":[],\"d\":[],\"e\":[]}", jsonStr); }