From ec204f8fc25b1d212b707fd84e92cfe19a9ba5c0 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 3 Aug 2024 12:55:10 +0800 Subject: [PATCH] fix code --- .../dromara/hutool/json/InternalJSONUtil.java | 46 ++++++++++++++++- .../org/dromara/hutool/json/JSONTokener.java | 3 +- .../hutool/json/mapper/JSONValueMapper.java | 49 ------------------- .../hutool/json/xml/JSONXMLParser.java | 6 +-- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java index fc1afd4d9..12f276026 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/InternalJSONUtil.java @@ -34,6 +34,7 @@ import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Type; +import java.math.BigDecimal; import java.util.*; import java.util.function.Predicate; @@ -44,7 +45,50 @@ import java.util.function.Predicate; */ public final class InternalJSONUtil { - private InternalJSONUtil() { + /** + * 尝试转换字符串为number, boolean, or null,无法转换返回String
+ * 此方法用于解析JSON字符串时,将字符串中的值转换为JSON值对象 + * + * @param string A String. + * @return A simple JSON value. + */ + public static Object parseValueFromString(final String string) { + // null处理 + if (StrUtil.isEmpty(string) || StrUtil.NULL.equalsIgnoreCase(string)) { + return null; + } + + // boolean处理 + if ("true".equalsIgnoreCase(string)) { + return Boolean.TRUE; + } + if ("false".equalsIgnoreCase(string)) { + return Boolean.FALSE; + } + + // Number处理 + final char b = string.charAt(0); + if ((b >= '0' && b <= '9') || b == '-') { + try { + if (StrUtil.containsAnyIgnoreCase(string, ".", "e")) { + // pr#192@Gitee,Double会出现小数精度丢失问题,此处使用BigDecimal + return new BigDecimal(string); + } else { + final long myLong = Long.parseLong(string); + if (string.equals(Long.toString(myLong))) { + if (myLong == (int) myLong) { + return (int) myLong; + } else { + return myLong; + } + } + } + } catch (final Exception ignore) { + } + } + + // 其它情况返回原String值下 + return string; } /** diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONTokener.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONTokener.java index 95261aa19..bceb0b955 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONTokener.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONTokener.java @@ -15,7 +15,6 @@ package org.dromara.hutool.json; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.io.ReaderWrapper; import org.dromara.hutool.core.lang.Assert; -import org.dromara.hutool.json.mapper.JSONValueMapper; import java.io.IOException; import java.io.InputStream; @@ -393,7 +392,7 @@ public class JSONTokener extends ReaderWrapper { if (valueString.isEmpty()) { throw this.syntaxError("Missing value"); } - return getOnlyStringValue ? valueString : JSONValueMapper.toJsonValue(valueString); + return getOnlyStringValue ? valueString : InternalJSONUtil.parseValueFromString(valueString); } /** diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/mapper/JSONValueMapper.java b/hutool-json/src/main/java/org/dromara/hutool/json/mapper/JSONValueMapper.java index c81a52869..cd464d5c5 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/mapper/JSONValueMapper.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/mapper/JSONValueMapper.java @@ -13,7 +13,6 @@ package org.dromara.hutool.json.mapper; import org.dromara.hutool.core.array.ArrayUtil; -import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.json.JSON; import org.dromara.hutool.json.JSONArray; @@ -22,8 +21,6 @@ import org.dromara.hutool.json.JSONObject; import org.dromara.hutool.json.serialize.JSONStringer; import org.dromara.hutool.json.writer.GlobalValueWriters; -import java.math.BigDecimal; - /** * 对象和JSON值映射器,用于转换对象为JSON对象中的值
* 有效的JSON值包括: @@ -51,52 +48,6 @@ public class JSONValueMapper { return new JSONValueMapper(jsonConfig); } - /** - * 尝试转换字符串为number, boolean, or null,无法转换返回String
- * 此方法用于解析JSON字符串时,将字符串中的值转换为JSON值对象 - * - * @param string A String. - * @return A simple JSON value. - */ - public static Object toJsonValue(final String string) { - // null处理 - if (StrUtil.isEmpty(string) || StrUtil.NULL.equalsIgnoreCase(string)) { - return null; - } - - // boolean处理 - if ("true".equalsIgnoreCase(string)) { - return Boolean.TRUE; - } - if ("false".equalsIgnoreCase(string)) { - return Boolean.FALSE; - } - - // Number处理 - final char b = string.charAt(0); - if ((b >= '0' && b <= '9') || b == '-') { - try { - if (StrUtil.containsAnyIgnoreCase(string, ".", "e")) { - // pr#192@Gitee,Double会出现小数精度丢失问题,此处使用BigDecimal - return new BigDecimal(string); - } else { - final long myLong = Long.parseLong(string); - if (string.equals(Long.toString(myLong))) { - if (myLong == (int) myLong) { - return (int) myLong; - } else { - return myLong; - } - } - } - } catch (final Exception ignore) { - } - } - - // 其它情况返回原String值下 - return string; - } - private final JSONConfig jsonConfig; /** diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/xml/JSONXMLParser.java b/hutool-json/src/main/java/org/dromara/hutool/json/xml/JSONXMLParser.java index 9d22f1522..d08f36317 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/xml/JSONXMLParser.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/xml/JSONXMLParser.java @@ -16,9 +16,9 @@ import org.dromara.hutool.core.lang.mutable.MutableEntry; import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.xml.XmlConstants; +import org.dromara.hutool.json.InternalJSONUtil; import org.dromara.hutool.json.JSONException; import org.dromara.hutool.json.JSONObject; -import org.dromara.hutool.json.mapper.JSONValueMapper; import java.util.function.Predicate; @@ -168,7 +168,7 @@ public class JSONXMLParser { if (!(token instanceof String)) { throw x.syntaxError("Missing value"); } - jsonobject.append(string, keepStrings ? token : JSONValueMapper.toJsonValue((String) token)); + jsonobject.append(string, keepStrings ? token : InternalJSONUtil.parseValueFromString((String) token)); token = null; } else { jsonobject.append(string, ""); @@ -198,7 +198,7 @@ public class JSONXMLParser { } else if (token instanceof String) { string = (String) token; if (!string.isEmpty()) { - jsonobject.append("content", keepStrings ? token : JSONValueMapper.toJsonValue(string)); + jsonobject.append("content", keepStrings ? token : InternalJSONUtil.parseValueFromString(string)); } } else if (token == XmlConstants.C_LT) {