From 43a0201a202a14a56a63ed0327ebbc5675c1a4b3 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 22 Sep 2024 11:22:18 +0800 Subject: [PATCH] fix code --- .../org/dromara/hutool/json/JSONArray.java | 55 ++----------- .../org/dromara/hutool/json/JSONGetter.java | 81 ++++++++----------- .../org/dromara/hutool/json/JSONObject.java | 5 +- .../JSONObjectValueProvider.java | 2 +- .../json/serializer/impl/BeanTypeAdapter.java | 1 + .../serializer/impl/RecordDeserializer.java | 1 + .../dromara/hutool/json/JSONArrayTest.java | 2 +- 7 files changed, 47 insertions(+), 100 deletions(-) rename hutool-json/src/main/java/org/dromara/hutool/json/{serializer/impl => convert}/JSONObjectValueProvider.java (96%) 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 64ab1d7da..c8e46f35a 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 @@ -107,20 +107,8 @@ public class JSONArray extends ListWrapper implements JSON, JSONGetter implements JSON, JSONGetter JSON类型 - * @param type JSON类型 - */ - public Iterable jsonIter(final Class type) { - final Iterator iterator = iterator(); - return () -> new Iterator() { - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public T next() { - return type.cast(iterator.next()); - } - @Override - public void remove() { - iterator.remove(); - } - }; - } - - @Override - @SuppressWarnings({"unchecked"}) - public T[] toArray(final T[] a) { - return (T[]) ArrayConverter.INSTANCE.convert(a.getClass().getComponentType(), this); - } - @Override public boolean addAll(final int index, final Collection c) { if (CollUtil.isEmpty(c)) { @@ -264,6 +219,12 @@ public class JSONArray extends ListWrapper implements JSON, JSONGetter T[] toArray(final T[] a) { + return (T[]) ArrayConverter.INSTANCE.convert(a.getClass().getComponentType(), this); + } + /** * 转为Bean数组 * diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONGetter.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONGetter.java index 9a4c59c74..e97f68ac9 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONGetter.java @@ -16,11 +16,8 @@ package org.dromara.hutool.json; -import org.dromara.hutool.core.convert.CompositeConverter; import org.dromara.hutool.core.lang.getter.TypeGetter; import org.dromara.hutool.core.util.ObjUtil; -import org.dromara.hutool.json.serializer.JSONDeserializer; -import org.dromara.hutool.json.serializer.TypeAdapterManager; import java.lang.reflect.Type; import java.util.List; @@ -48,7 +45,7 @@ public interface JSONGetter extends TypeGetter { * @return true 无此key或值为{@code null}返回{@code false},其它返回{@code true} */ default boolean isNull(final K key) { - return ObjUtil.isNull(this.getObj(key)); + return ObjUtil.isNull(this.getJSON(key)); } /** @@ -82,15 +79,16 @@ public interface JSONGetter extends TypeGetter { * @return JSONArray对象,如果值为{@code null},返回{@code null},非JSONArray类型,尝试转换,转换失败抛出异常 */ default JSONArray getJSONArray(final K key) { - final Object object = this.getObj(key); - if (ObjUtil.isNull(object)) { + final JSON json = getJSON(key); + if (null == json) { return null; } - if (object instanceof JSON) { - return (JSONArray) object; + if (json instanceof JSONObject) { + return JSONUtil.parseArray(json, config()); } - return JSONUtil.parseArray(object, config()); + + return json.asJSONArray(); } /** @@ -101,35 +99,12 @@ public interface JSONGetter extends TypeGetter { * @return JSONObject对象,如果值为{@code null},返回{@code null},非JSONObject类型,尝试转换,转换失败抛出异常 */ default JSONObject getJSONObject(final K key) { - final Object obj = getObj(key); - if(null == obj){ + final JSON json = getJSON(key); + if (null == json) { return null; } - if(obj instanceof JSONObject){ - return (JSONObject) obj; - } - - throw new JSONException("JSONObject expected, but " + obj.getClass()); - } - - /** - * 从JSON中直接获取Bean对象
- * 先获取JSONObject对象,然后转为Bean对象 - * - * @param Bean类型 - * @param key KEY - * @param beanType Bean类型 - * @return Bean对象,如果值为null或者非JSONObject类型,返回null - * @since 3.1.1 - */ - @SuppressWarnings("unchecked") - default T getBean(final K key, final Class beanType) { - final Object obj = getObj(key); - if(null == obj || beanType.isInstance(obj)){ - return (T) obj; - } - return ((JSON)obj).toBean(beanType); + return json.asJSONObject(); } /** @@ -147,24 +122,34 @@ public interface JSONGetter extends TypeGetter { return (null == jsonArray) ? null : jsonArray.toList(beanType); } - @SuppressWarnings("unchecked") + @Override + default Object getObj(final K key, final Object defaultValue) { + final Object value; + final JSON json = getJSON(key); + if (json instanceof JSONPrimitive) { + value = ((JSONPrimitive) json).getValue(); + } else { + value = json; + } + return ObjUtil.defaultIfNull(value, defaultValue); + } + @Override default T get(final K key, final Type type, final T defaultValue) { - Object value = this.getObj(key); + final JSON value = getJSON(key); if (ObjUtil.isNull(value)) { return defaultValue; } - if(value instanceof JSON){ - final JSONDeserializer deserializer = TypeAdapterManager.getInstance().getDeserializer((JSON) value, type); - if(null == deserializer){ - throw new JSONException("No deserializer for type: " + type); - } - value = deserializer.deserialize((JSON) value, type); - return null == value ? defaultValue : (T) value; - } - - // JSONPrimitive中的值 - return CompositeConverter.getInstance().convert(type, value, defaultValue); + return ObjUtil.defaultIfNull(value.toBean(type), defaultValue); } + + /** + * 获取JSON对象
+ * 在JSON树模型中,JSON的节点都以JSON格式存储,所有get方法都基于此方法 + * + * @param key KEY + * @return JSON对象 + */ + JSON getJSON(final K key); } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java index b6eba81f3..954cf1952 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONObject.java @@ -123,10 +123,9 @@ public class JSONObject extends MapWrapper implements JSON, JSONGe } @Override - public JSON get(final Object key) { - return super.get(key); + public JSON getJSON(final String key) { + return get(key); } - // endregion // region ----- set diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/JSONObjectValueProvider.java b/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONObjectValueProvider.java similarity index 96% rename from hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/JSONObjectValueProvider.java rename to hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONObjectValueProvider.java index e6b59759e..302d4dfbd 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/JSONObjectValueProvider.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONObjectValueProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.dromara.hutool.json.serializer.impl; +package org.dromara.hutool.json.convert; import org.dromara.hutool.core.bean.copier.ValueProvider; import org.dromara.hutool.json.JSON; diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java index 138bfc0fa..17791de91 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/BeanTypeAdapter.java @@ -26,6 +26,7 @@ import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.json.InternalJSONUtil; import org.dromara.hutool.json.JSON; import org.dromara.hutool.json.JSONObject; +import org.dromara.hutool.json.convert.JSONObjectValueProvider; import org.dromara.hutool.json.serializer.JSONContext; import org.dromara.hutool.json.serializer.MatcherJSONDeserializer; import org.dromara.hutool.json.serializer.MatcherJSONSerializer; diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/RecordDeserializer.java b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/RecordDeserializer.java index 71a2b960a..98681dca6 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/RecordDeserializer.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/serializer/impl/RecordDeserializer.java @@ -20,6 +20,7 @@ import org.dromara.hutool.core.bean.RecordUtil; import org.dromara.hutool.core.reflect.TypeUtil; import org.dromara.hutool.json.JSON; import org.dromara.hutool.json.JSONObject; +import org.dromara.hutool.json.convert.JSONObjectValueProvider; import org.dromara.hutool.json.serializer.MatcherJSONDeserializer; import java.lang.reflect.Type; 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 d29b8ca72..4242eccc5 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 @@ -340,7 +340,7 @@ public class JSONArrayTest { array.add(JSONUtil.ofObj().set("name", "ccc")); final StringBuilder result = new StringBuilder(); - array.jsonIter(JSONObject.class).forEach(result::append); + array.forEach(result::append); assertEquals("{\"name\":\"aaa\"}{\"name\":\"bbb\"}{\"name\":\"ccc\"}", result.toString()); } }