From f69d49593b558a67b2ea850eafe29c060e7e21f7 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 28 Mar 2022 13:29:31 +0800 Subject: [PATCH] deprecated json isOrder --- CHANGELOG.md | 3 +- .../java/cn/hutool/json/InternalJSONUtil.java | 27 ------------- .../main/java/cn/hutool/json/JSONConfig.java | 18 ++++----- .../main/java/cn/hutool/json/JSONObject.java | 24 ++++++++---- .../main/java/cn/hutool/json/JSONUtil.java | 16 +++----- .../java/cn/hutool/json/Issue2223Test.java | 38 +++++++++++++++++++ .../java/cn/hutool/json/Issues1881Test.java | 2 +- .../java/cn/hutool/json/JSONNullTest.java | 2 +- .../java/cn/hutool/json/JSONObjectTest.java | 15 +++----- .../java/cn/hutool/json/TransientTest.java | 2 +- .../src/main/java/cn/hutool/jwt/Claims.java | 2 +- 11 files changed, 81 insertions(+), 68 deletions(-) create mode 100755 hutool-json/src/test/java/cn/hutool/json/Issue2223Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e2c7fae40..a33ad83c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.0 (2022-03-27) +# 5.8.0 (2022-03-28) ### ❌不兼容特性 * 【db 】 【不向下兼容 】增加MongoDB4.x支持返回MongoClient变更(pr#568@Gitee) @@ -17,6 +17,7 @@ * 【poi 】 【可能兼容问题】ExcelUtil.getBigWriter返回值改为BigExcelWriter * 【core 】 【可能兼容问题】Opt.ofEmptyAble参数由List改为Collection子类(pr#580@Gitee) * 【json 】 【可能兼容问题】JSON转Bean时,使用JSON本身的相关设置,而非默认(issue#2212@Github) +* 【json 】 【可能兼容问题】JSONConfig中isOrder废弃,默认全部有序 ### 🐣新特性 * 【http 】 HttpRequest.form采用TableMap方式(issue#I4W427@Gitee) diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index af7e617e3..c71277e3a 100644 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -10,9 +10,7 @@ import cn.hutool.core.util.StrUtil; import java.math.BigDecimal; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.Map; -import java.util.SortedMap; /** * 内部JSON工具类,仅用于JSON内部使用 @@ -168,31 +166,6 @@ public final class InternalJSONUtil { && (false == (obj instanceof Map)); } - /** - * 判断给定对象是否有序,用于辅助创建{@link JSONObject}时是否有序 - * - * - * - * @param value 被转换的对象 - * @return 是否有序 - * @since 5.7.0 - */ - static boolean isOrder(Object value) { - if (value instanceof LinkedHashMap || value instanceof SortedMap) { - return true; - } else if (value instanceof JSONGetter) { - final JSONConfig config = ((JSONGetter) value).getConfig(); - if (null != config) { - return config.isOrder(); - } - } - - return false; - } - /** * 将{@link JSONConfig}参数转换为Bean拷贝所用的{@link CopyOptions} * diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java index 2d9279c1c..0b437a8f3 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java @@ -15,11 +15,7 @@ public class JSONConfig implements Serializable { private static final long serialVersionUID = 119730355204738278L; /** - * 是否有序,顺序按照加入顺序排序,只针对JSONObject有效 - */ - private boolean order; - /** - * 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序,否则按照hash排序 + * 键排序规则,{@code null}表示不排序,不排序情况下,按照加入顺序排序 */ private Comparator keyComparator; /** @@ -61,9 +57,11 @@ public class JSONConfig implements Serializable { * 是否有序,顺序按照加入顺序排序,只针对JSONObject有效 * * @return 是否有序 + * @deprecated 始终返回 {@code true} */ + @Deprecated public boolean isOrder() { - return order; + return true; } /** @@ -71,15 +69,17 @@ public class JSONConfig implements Serializable { * * @param order 是否有序 * @return this + * @deprecated 始终有序,无需设置 */ + @SuppressWarnings("unused") + @Deprecated public JSONConfig setOrder(boolean order) { - this.order = order; return this; } /** * 获取键排序规则
- * 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序,否则按照hash排序 + * 键排序规则,{@code null}表示不排序,不排序情况下,按照加入顺序排序 * * @return 键排序规则 * @since 5.7.21 @@ -100,7 +100,7 @@ public class JSONConfig implements Serializable { /** * 设置键排序规则
- * 键排序规则,{@code null}表示不排序,不排序情况下,如果{@link #order}为{@code true}按照加入顺序排序,否则按照hash排序 + * 键排序规则,{@code null}表示不排序,不排序情况下,按照加入顺序排序 * * @param keyComparator 键排序规则 * @return this 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 4dbbc1b21..d45326275 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -27,6 +27,7 @@ import java.math.BigInteger; import java.util.Collection; import java.util.Comparator; import java.util.Enumeration; +import java.util.LinkedHashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.TreeMap; @@ -91,9 +92,12 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @param isIgnoreCase 是否忽略KEY大小写 * @param isOrder 是否有序 * @since 3.3.1 + * @deprecated isOrder无效 */ + @SuppressWarnings("unused") + @Deprecated public JSONObject(int capacity, boolean isIgnoreCase, boolean isOrder) { - this(capacity, JSONConfig.create().setIgnoreCase(isIgnoreCase).setOrder(isOrder)); + this(capacity, JSONConfig.create().setIgnoreCase(isIgnoreCase)); } /** @@ -148,7 +152,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @since 3.0.9 */ public JSONObject(Object source, boolean ignoreNullValue) { - this(source, ignoreNullValue, InternalJSONUtil.isOrder(source)); + this(source, JSONConfig.create().setIgnoreNullValue(ignoreNullValue)); } /** @@ -164,9 +168,12 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @param ignoreNullValue 是否忽略空值,如果source为JSON字符串,不忽略空值 * @param isOrder 是否有序 * @since 4.2.2 + * @deprecated isOrder参数不再需要,JSONObject默认有序! */ + @SuppressWarnings("unused") + @Deprecated public JSONObject(Object source, boolean ignoreNullValue, boolean isOrder) { - this(source, JSONConfig.create().setOrder(isOrder)// + this(source, JSONConfig.create()// .setIgnoreCase((source instanceof CaseInsensitiveMap))// .setIgnoreNullValue(ignoreNullValue) ); @@ -239,9 +246,12 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @param isOrder 是否有序 * @throws JSONException JSON字符串语法错误 * @since 4.2.2 + * @deprecated isOrder无效 */ + @SuppressWarnings("unused") + @Deprecated public JSONObject(CharSequence source, boolean isOrder) throws JSONException { - this(source, JSONConfig.create().setOrder(isOrder)); + this(source, JSONConfig.create()); } // -------------------------------------------------------------------------------------------------------------------- Constructor end @@ -689,17 +699,15 @@ public class JSONObject extends MapWrapper implements JSON, JSON final Comparator keyComparator = config.getKeyComparator(); if (config.isIgnoreCase()) { if (null != keyComparator) { - // 比较器存在情况下,isOrder无效 rawHashMap = new CaseInsensitiveTreeMap<>(keyComparator); } else { - rawHashMap = config.isOrder() ? new CaseInsensitiveLinkedMap<>(capacity) : new CaseInsensitiveMap<>(capacity); + rawHashMap = new CaseInsensitiveLinkedMap<>(capacity); } } else { if (null != keyComparator) { - // 比较器存在情况下,isOrder无效 rawHashMap = new TreeMap<>(keyComparator); } else { - rawHashMap = MapUtil.newHashMap(capacity, config.isOrder()); + rawHashMap = new LinkedHashMap<>(capacity); } } return rawHashMap; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index a1ba61d1f..d1f63d556 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -110,14 +110,7 @@ public class JSONUtil { * @since 5.3.1 */ public static JSONObject parseObj(Object obj, JSONConfig config) { - // 默认配置,根据对象类型决定是否有序 - if(null == config){ - config = JSONConfig.create(); - if(InternalJSONUtil.isOrder(obj)){ - config.setOrder(true); - } - } - return new JSONObject(obj, config); + return new JSONObject(obj, ObjectUtil.defaultIfNull(config, JSONConfig::create)); } /** @@ -129,7 +122,7 @@ public class JSONUtil { * @since 3.0.9 */ public static JSONObject parseObj(Object obj, boolean ignoreNullValue) { - return parseObj(obj, ignoreNullValue, InternalJSONUtil.isOrder(obj)); + return new JSONObject(obj, ignoreNullValue); } /** @@ -140,9 +133,12 @@ public class JSONUtil { * @param isOrder 是否有序 * @return JSONObject * @since 4.2.2 + * @deprecated isOrder参数不再有效 */ + @SuppressWarnings("unused") + @Deprecated public static JSONObject parseObj(Object obj, boolean ignoreNullValue, boolean isOrder) { - return new JSONObject(obj, ignoreNullValue, isOrder); + return new JSONObject(obj, ignoreNullValue); } /** diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2223Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2223Test.java new file mode 100755 index 000000000..3c8685160 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2223Test.java @@ -0,0 +1,38 @@ +package cn.hutool.json; + +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class Issue2223Test { + + @Test + public void toStrOrderTest() { + Map m1 = new LinkedHashMap<>(); + for (long i = 0; i < 5; i++) { + m1.put("2022/" + i, i); + } + + Assert.assertEquals("{\"2022/0\":0,\"2022/1\":1,\"2022/2\":2,\"2022/3\":3,\"2022/4\":4}", JSONUtil.toJsonStr(m1)); + + Map> map1 = new HashMap<>(); + map1.put("m1", m1); + + Assert.assertEquals("{\"m1\":{\"2022/0\":0,\"2022/1\":1,\"2022/2\":2,\"2022/3\":3,\"2022/4\":4}}", + JSONUtil.toJsonStr(map1, JSONConfig.create())); + + final BeanDemo beanDemo = new BeanDemo(); + beanDemo.setMap1(map1); + Assert.assertEquals("{\"map1\":{\"m1\":{\"2022/0\":0,\"2022/1\":1,\"2022/2\":2,\"2022/3\":3,\"2022/4\":4}}}", + JSONUtil.toJsonStr(beanDemo, JSONConfig.create())); + } + + @Data + static class BeanDemo { + Map> map1; + } +} diff --git a/hutool-json/src/test/java/cn/hutool/json/Issues1881Test.java b/hutool-json/src/test/java/cn/hutool/json/Issues1881Test.java index a8475bcff..220d3b608 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Issues1881Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issues1881Test.java @@ -31,6 +31,6 @@ public class Issues1881Test { holderContactVOList.add(new ThingsHolderContactVO().setId(1L).setName("1")); holderContactVOList.add(new ThingsHolderContactVO().setId(2L).setName("2")); - Assert.assertEquals("[{\"name\":\"1\",\"id\":1},{\"name\":\"2\",\"id\":2}]", JSONUtil.parseArray(holderContactVOList).toString()); + Assert.assertEquals("[{\"id\":1,\"name\":\"1\"},{\"id\":2,\"name\":\"2\"}]", JSONUtil.parseArray(holderContactVOList).toString()); } } diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONNullTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONNullTest.java index 354b2afa3..b4a718536 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONNullTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONNullTest.java @@ -26,7 +26,7 @@ public class JSONNullTest { " \"device_model\": null,\n" + " \"device_status_date\": null,\n" + " \"imsi\": null,\n" + - " \"act_date\": \"2021-07-23T06:23:26.000+00:00\"}", true, true); + " \"act_date\": \"2021-07-23T06:23:26.000+00:00\"}", true); Assert.assertFalse(bodyjson.containsKey("device_model")); Assert.assertFalse(bodyjson.containsKey("device_status_date")); Assert.assertFalse(bodyjson.containsKey("imsi")); 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 249d458a5..bd9440218 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -289,7 +289,7 @@ public class JSONObjectTest { userA.setDate(new Date()); userA.setSqs(CollectionUtil.newArrayList(new Seq(null), new Seq("seq2"))); - JSONObject json = JSONUtil.parseObj(userA, false, true); + JSONObject json = JSONUtil.parseObj(userA, false); Assert.assertTrue(json.containsKey("a")); Assert.assertTrue(json.getJSONArray("sqs").getJSONObject(0).containsKey("seq")); @@ -422,7 +422,6 @@ public class JSONObjectTest { public void setDateFormatTest() { JSONConfig jsonConfig = JSONConfig.create(); jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); - jsonConfig.setOrder(true); JSONObject json = new JSONObject(jsonConfig); json.append("date", DateUtil.parse("2020-06-05 11:16:11")); @@ -435,7 +434,6 @@ public class JSONObjectTest { public void setDateFormatTest2() { JSONConfig jsonConfig = JSONConfig.create(); jsonConfig.setDateFormat("yyyy#MM#dd"); - jsonConfig.setOrder(true); Date date = DateUtil.parse("2020-06-05 11:16:11"); JSONObject json = new JSONObject(jsonConfig); @@ -456,7 +454,6 @@ public class JSONObjectTest { public void setCustomDateFormatTest() { JSONConfig jsonConfig = JSONConfig.create(); jsonConfig.setDateFormat("#sss"); - jsonConfig.setOrder(true); Date date = DateUtil.parse("2020-06-05 11:16:11"); JSONObject json = new JSONObject(jsonConfig); @@ -616,7 +613,7 @@ public class JSONObjectTest { @Test public void filterIncludeTest() { - JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + JSONObject json1 = JSONUtil.createObj(JSONConfig.create()) .set("a", "value1") .set("b", "value2") .set("c", "value3") @@ -628,7 +625,7 @@ public class JSONObjectTest { @Test public void filterExcludeTest() { - JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + JSONObject json1 = JSONUtil.createObj(JSONConfig.create()) .set("a", "value1") .set("b", "value2") .set("c", "value3") @@ -640,7 +637,7 @@ public class JSONObjectTest { @Test public void editTest() { - JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + JSONObject json1 = JSONUtil.createObj(JSONConfig.create()) .set("a", "value1") .set("b", "value2") .set("c", "value3") @@ -660,7 +657,7 @@ public class JSONObjectTest { @Test public void toUnderLineCaseTest() { - JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true)) + JSONObject json1 = JSONUtil.createObj(JSONConfig.create()) .set("aKey", "value1") .set("bJob", "value2") .set("cGood", "value3") @@ -675,7 +672,7 @@ public class JSONObjectTest { @Test public void nullToEmptyTest() { - JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setOrder(true).setIgnoreNullValue(false)) + JSONObject json1 = JSONUtil.createObj(JSONConfig.create().setIgnoreNullValue(false)) .set("a", null) .set("b", "value2"); diff --git a/hutool-json/src/test/java/cn/hutool/json/TransientTest.java b/hutool-json/src/test/java/cn/hutool/json/TransientTest.java index d179d5c71..753cf1bee 100644 --- a/hutool-json/src/test/java/cn/hutool/json/TransientTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/TransientTest.java @@ -21,7 +21,7 @@ public class TransientTest { //noinspection MismatchedQueryAndUpdateOfCollection final JSONObject jsonObject = new JSONObject(detailBill, JSONConfig.create().setTransientSupport(false)); - Assert.assertEquals("{\"bizNo\":\"bizNo\",\"id\":\"3243\"}", jsonObject.toString()); + Assert.assertEquals("{\"id\":\"3243\",\"bizNo\":\"bizNo\"}", jsonObject.toString()); } @Test diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java b/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java index 6279fec9e..39fd05db7 100644 --- a/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java +++ b/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java @@ -21,7 +21,7 @@ public class Claims implements Serializable { private static final long serialVersionUID = 1L; // 时间使用秒级时间戳表示 - private final JSONConfig CONFIG = JSONConfig.create().setDateFormat("#sss").setOrder(true); + private final JSONConfig CONFIG = JSONConfig.create().setDateFormat("#sss"); private JSONObject claimJSON;