From 5cd7e806e1f7f7e969c8a4f0eb1c5b53d744ab0b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 15 Oct 2021 01:27:16 +0800 Subject: [PATCH] add methods --- CHANGELOG.md | 1 + .../main/java/cn/hutool/json/JSONArray.java | 42 +++++++++++++++++- .../main/java/cn/hutool/json/JSONObject.java | 44 ++++++++++++++++++- .../java/cn/hutool/json/JSONArrayTest.java | 24 ++++++++++ .../java/cn/hutool/json/JSONObjectTest.java | 24 ++++++++++ 5 files changed, 132 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1df0b9d1..99d34efd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【core 】 增加RingIndexUtil(pr#438@Gitee) * 【core 】 Assert增加checkBetween重载(pr#436@Gitee) * 【core 】 ReUtil增加命名分组重载(pr#439@Gitee) +* 【json 】 toString和writer增加Filter(issue#I4DQNQ@Gitee) * ### 🐞Bug修复 * 【core 】 修复CollUtil.isEqualList两个null返回错误问题(issue#1885@Github) diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java index fdfafabc7..3cdea5a83 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -3,6 +3,8 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanPath; import cn.hutool.core.collection.ArrayIter; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Filter; +import cn.hutool.core.lang.Pair; import cn.hutool.core.text.StrJoiner; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -12,6 +14,7 @@ import cn.hutool.json.serialize.GlobalSerializeMapping; import cn.hutool.json.serialize.JSONSerializer; import cn.hutool.json.serialize.JSONWriter; +import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; @@ -529,11 +532,48 @@ public class JSONArray implements JSON, JSONGetter, List, Rando return this.toJSONString(0); } + /** + * 返回JSON字符串
+ * 支持过滤器,即选择哪些字段或值不写出 + * + * @param indentFactor 每层缩进空格数 + * @param filter 键值对过滤器 + * @return JSON字符串 + * @since 5.7.15 + */ + public String toJSONString(int indentFactor, Filter> filter){ + final StringWriter sw = new StringWriter(); + synchronized (sw.getBuffer()) { + return this.write(sw, indentFactor, 0, filter).toString(); + } + } + @Override public Writer write(Writer writer, int indentFactor, int indent) throws JSONException { + return write(writer, indentFactor, indent, null); + } + + /** + * 将JSON内容写入Writer
+ * 支持过滤器,即选择哪些字段或值不写出 + * + * @param writer writer + * @param indentFactor 缩进因子,定义每一级别增加的缩进量 + * @param indent 本级别缩进量 + * @param filter 过滤器 + * @return Writer + * @throws JSONException JSON相关异常 + * @since 5.7.15 + */ + public Writer write(Writer writer, int indentFactor, int indent, Filter> filter) throws JSONException { final JSONWriter jsonWriter = JSONWriter.of(writer, indentFactor, indent, config) .beginArray(); - this.forEach(jsonWriter::writeValue); + + CollUtil.forEach(this, (value, index)->{ + if (null == filter || filter.accept(new Pair<>(index, value))) { + jsonWriter.writeValue(value); + } + }); jsonWriter.end(); // 此处不关闭Writer,考虑writer后续还需要填内容 return writer; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 841d043c3..7358cedec 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -6,6 +6,8 @@ import cn.hutool.core.bean.copier.BeanCopier; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Filter; +import cn.hutool.core.lang.Pair; import cn.hutool.core.map.CaseInsensitiveLinkedMap; import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.MapUtil; @@ -18,6 +20,7 @@ import cn.hutool.json.serialize.JSONObjectSerializer; import cn.hutool.json.serialize.JSONSerializer; import cn.hutool.json.serialize.JSONWriter; +import java.io.StringWriter; import java.io.Writer; import java.math.BigDecimal; import java.math.BigInteger; @@ -552,17 +555,54 @@ public class JSONObject implements JSON, JSONGetter, Map return this.toJSONString(0); } + /** + * 返回JSON字符串
+ * 支持过滤器,即选择哪些字段或值不写出 + * + * @param indentFactor 每层缩进空格数 + * @param filter 键值对过滤器 + * @return JSON字符串 + * @since 5.7.15 + */ + public String toJSONString(int indentFactor, Filter> filter){ + final StringWriter sw = new StringWriter(); + synchronized (sw.getBuffer()) { + return this.write(sw, indentFactor, 0, filter).toString(); + } + } + @Override public Writer write(Writer writer, int indentFactor, int indent) throws JSONException { + return write(writer, indentFactor, indent, null); + } + + /** + * 将JSON内容写入Writer
+ * 支持过滤器,即选择哪些字段或值不写出 + * + * @param writer writer + * @param indentFactor 缩进因子,定义每一级别增加的缩进量 + * @param indent 本级别缩进量 + * @param filter 过滤器 + * @return Writer + * @throws JSONException JSON相关异常 + * @since 5.7.15 + */ + public Writer write(Writer writer, int indentFactor, int indent, Filter> filter) throws JSONException { final JSONWriter jsonWriter = JSONWriter.of(writer, indentFactor, indent, config) .beginObj(); - this.forEach(jsonWriter::writeField); + this.forEach((key, value) -> { + if (null == filter || filter.accept(new Pair<>(key, value))) { + jsonWriter.writeField(key, value); + } + }); jsonWriter.end(); - + // 此处不关闭Writer,考虑writer后续还需要填内容 return writer; } // ------------------------------------------------------------------------------------------------- Private method start + /** * Bean对象转Map * diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java index c4f8c6b6a..2b3522b9a 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java @@ -239,4 +239,28 @@ public class JSONArrayTest { private Integer id; private String name; } + + @Test + public void filterIncludeTest(){ + JSONArray json1 = JSONUtil.createArray() + .set("value1") + .set("value2") + .set("value3") + .set(true); + + final String s = json1.toJSONString(0, (pair) -> pair.getValue().equals("value2")); + Assert.assertEquals("[\"value2\"]", s); + } + + @Test + public void filterExcludeTest(){ + JSONArray json1 = JSONUtil.createArray() + .set("value1") + .set("value2") + .set("value3") + .set(true); + + final String s = json1.toJSONString(0, (pair) -> false == pair.getValue().equals("value2")); + Assert.assertEquals("[\"value1\",\"value3\",true]", s); + } } diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java index 03ce35541..f2983b859 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -609,4 +609,28 @@ public class JSONObjectTest { class BigDecimalBean{ private BigDecimal orderId; } + + @Test + public void filterIncludeTest(){ + JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + .set("a", "value1") + .set("b", "value2") + .set("c", "value3") + .set("d", true); + + final String s = json1.toJSONString(0, (pair) -> pair.getKey().equals("b")); + Assert.assertEquals("{\"b\":\"value2\"}", s); + } + + @Test + public void filterExcludeTest(){ + JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + .set("a", "value1") + .set("b", "value2") + .set("c", "value3") + .set("d", true); + + final String s = json1.toJSONString(0, (pair) -> false == pair.getKey().equals("b")); + Assert.assertEquals("{\"a\":\"value1\",\"c\":\"value3\",\"d\":true}", s); + } }