Repository: alibaba/fastjson2
Pull request #3527 (2025-04-29 19:13:59)

Bump com.google.code.gson:gson from 2.13.0 to 2.13.1
Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.13.0 to 2.13.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/google/gson/releases">com.google.code.gson:gson's releases</a>.</em></p>
<blockquote>
<h2>Gson 2.13.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Give FieldNamingStrategy the ability to return multiple String names by <a href="https://github.com/mfriesen"><code>@​mfriesen</code></a> in <a href="https://redirect.github.com/google/gson/pull/2776">google/gson#2776</a></li>
<li>Remove outdated android-proguard-example by <a href="https://github.com/Goooler"><code>@​Goooler</code></a> in <a href="https://redirect.github.com/google/gson/pull/2843">google/gson#2843</a></li>
<li>Adjust Troubleshooting Guide ProGuard / R8 section by <a href="https://github.com/Marcono1234"><code>@​Marcono1234</code></a> in <a href="https://redirect.github.com/google/gson/pull/2844">google/gson#2844</a></li>
<li>Update dependencies, including the problematic <code>com.google.errorprone:error_prone_annotations:2.37.0</code>.</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/mfriesen"><code>@​mfriesen</code></a> made their first contribution in <a href="https://redirect.github.com/google/gson/pull/2776">google/gson#2776</a></li>
<li><a href="https://github.com/Goooler"><code>@​Goooler</code></a> made their first contribution in <a href="https://redirect.github.com/google/gson/pull/2843">google/gson#2843</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/google/gson/compare/gson-parent-2.13.0...gson-parent-2.13.1">https://github.com/google/gson/compare/gson-parent-2.13.0...gson-parent-2.13.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/google/gson/commit/257bee9eff81889893ca02a6925aa1b620378e9e"><code>257bee9</code></a> [maven-release-plugin] prepare release gson-parent-2.13.1</li>
<li><a href="https://github.com/google/gson/commit/63d74b39400be6e2a244a227820fa9d984a493e9"><code>63d74b3</code></a> Bump the maven group with 5 updates (<a href="https://redirect.github.com/google/gson/issues/2851">#2851</a>)</li>
<li><a href="https://github.com/google/gson/commit/810e3560590bb807ed7113ccfff716aac21a3f33"><code>810e356</code></a> Add shrinker test for interface implementation being deserialized (<a href="https://redirect.github.com/google/gson/issues/2845">#2845</a>)</li>
<li><a href="https://github.com/google/gson/commit/00ae39775708147e115512be5d4f92bee02e9b89"><code>00ae397</code></a> Adjust Troubleshooting Guide ProGuard / R8 section (<a href="https://redirect.github.com/google/gson/issues/2844">#2844</a>)</li>
<li><a href="https://github.com/google/gson/commit/0eec6f35c59f164ee49ef175e38896db20296b44"><code>0eec6f3</code></a> Remove outdated android-proguard-example (<a href="https://redirect.github.com/google/gson/issues/2843">#2843</a>)</li>
<li><a href="https://github.com/google/gson/commit/4e65e6ab368d92638b4ca04521958dbf1d3753e7"><code>4e65e6a</code></a> Give FieldNamingStrategy the ability to return multiple String names (<a href="https://redirect.github.com/google/gson/issues/2776">#2776</a>)</li>
<li><a href="https://github.com/google/gson/commit/6010131366fa3f72c3f07151bff6d1c4e1a7f6e0"><code>6010131</code></a> [maven-release-plugin] prepare for next development iteration</li>
<li>See full diff in <a href="https://github.com/google/gson/compare/gson-parent-2.13.0...gson-parent-2.13.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.google.code.gson:gson&package-manager=maven&previous-version=2.13.0&new-version=2.13.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has been open for over 30 days.


codecov-commenter: ## [Codecov](https://app.codecov.io/gh/alibaba/fastjson2/pull/3527?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 72.50%. Comparing base [(`80c005c`)](https://app.codecov.io/gh/alibaba/fastjson2/commit/80c005c49100cc50e7f125f9ad01027a7560a2e1?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba) to head [(`e6910f5`)](https://app.codecov.io/gh/alibaba/fastjson2/commit/e6910f5ec93d980bf157c0ba5f4e6e06cea570a8?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba).
> Report is 3 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##               main    #3527      +/-   ##
============================================
+ Coverage     72.32%   72.50%   +0.18%     
+ Complexity    23180    23110      -70     
============================================
  Files           682      670      -12     
  Lines         90759    90254     -505     
  Branches      20582    20500      -82     
============================================
- Hits          65638    65440     -198     
+ Misses        16688    16395     -293     
+ Partials       8433     8419      -14     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/alibaba/fastjson2/pull/3527?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>

Patch:
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONLargeObjectException.java b/core/src/main/java/com/alibaba/fastjson2/JSONLargeObjectException.java
new file mode 100644
index 000000000..e374266a6
--- /dev/null
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONLargeObjectException.java
@@ -0,0 +1,17 @@
+package com.alibaba.fastjson2;
+
+/**
+ * Exception thrown when attempting to serialize an object that exceeds size limits
+ * and the LargeObject feature is not enabled.
+ *
+ * @since 2.0.58
+ */
+public class JSONLargeObjectException
+        extends JSONException {
+    public JSONLargeObjectException(String message) {
+        super(message);
+    }
+    public JSONLargeObjectException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONPathSegmentName.java b/core/src/main/java/com/alibaba/fastjson2/JSONPathSegmentName.java
index a0ad4eb78..37dfe666c 100644
--- a/core/src/main/java/com/alibaba/fastjson2/JSONPathSegmentName.java
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONPathSegmentName.java
@@ -333,6 +333,10 @@ class JSONPathSegmentName
                 ? context.root
                 : context.parent.value;
 
+        if (object instanceof JSONPath.Sequence) {
+            object = ((JSONPath.Sequence) object).values;
+        }
+
         if (object instanceof Map) {
             Map map = (Map) object;
             Object origin = map.put(name, value);
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONPathSingleName.java b/core/src/main/java/com/alibaba/fastjson2/JSONPathSingleName.java
index c160bbc67..f871d93ed 100644
--- a/core/src/main/java/com/alibaba/fastjson2/JSONPathSingleName.java
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONPathSingleName.java
@@ -115,6 +115,11 @@ final class JSONPathSingleName
             return ((Map) root).containsKey(name);
         }
 
+        if (root instanceof List) {
+            List list = (List) root;
+            return !list.isEmpty() && contains(list.get(0));
+        }
+
         ObjectWriterProvider provider = getWriterContext().provider;
 
         ObjectWriter objectWriter = provider.getObjectWriter(root.getClass());
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONReader.java b/core/src/main/java/com/alibaba/fastjson2/JSONReader.java
index 2314f0366..6483ba12a 100644
--- a/core/src/main/java/com/alibaba/fastjson2/JSONReader.java
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONReader.java
@@ -1881,6 +1881,20 @@ public abstract class JSONReader
 
     public abstract String readString();
 
+    public byte[] readBase64() {
+        String str = readString();
+        if (str != null) {
+            String prefix = "data:image/jpeg;base64,";
+            if (str.startsWith(prefix)) {
+                str = str.substring(prefix.length());
+            }
+        }
+        if (str.isEmpty()) {
+            return new byte[0];
+        }
+        return Base64.getDecoder().decode(str);
+    }
+
     public String[] readStringArray() {
         if ((ch == 'n') && nextIfNull()) {
             return null;
@@ -2507,6 +2521,7 @@ public abstract class JSONReader
             return null;
         }
 
+        wasNull = false;
         boolean boolValue = readBoolValue();
         if (!boolValue && wasNull) {
             return null;
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONReaderUTF8.java b/core/src/main/java/com/alibaba/fastjson2/JSONReaderUTF8.java
index e3c69152a..c49b141dc 100644
--- a/core/src/main/java/com/alibaba/fastjson2/JSONReaderUTF8.java
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONReaderUTF8.java
@@ -7406,6 +7406,55 @@ class JSONReaderUTF8
         return val;
     }
 
+    public final byte[] readBase64() {
+        byte[] bytes = this.bytes;
+        int offset = this.offset, end = this.end;
+        int ch = this.ch;
+        int index = IOUtils.indexOfQuote(bytes, ch, offset, end);
+        if (index == -1) {
+            throw error("invalid escape character EOI");
+        }
+
+        int slashIndex = indexOfSlash(this, bytes, offset, end);
+        if (slashIndex != -1) {
+            throw error("invalid base64 string");
+        }
+
+        byte[] decoded;
+        if (index != offset) {
+            boolean hasPrefix = true;
+            String prefix = "data:image/jpeg;base64,";
+            for (int i = 0; i < prefix.length(); i++) {
+                if (bytes[offset + i] != prefix.charAt(i)) {
+                    hasPrefix = false;
+                    break;
+                }
+            }
+            if (hasPrefix) {
+                offset += prefix.length();
+            }
+
+            byte[] src = Arrays.copyOfRange(bytes, offset, index);
+            decoded = Base64.getDecoder().decode(src);
+        } else {
+            decoded = new byte[0];
+        }
+
+        offset = index + 1;
+
+        ch = offset == end ? EOI : (char) bytes[offset++];
+        if (comma = ch == ',') {
+            ch = offset == end ? EOI : bytes[offset++];
+            while (ch <= ' ' && (1L << ch & SPACE) != 0) {
+                ch = offset == end ? EOI : bytes[offset++];
+            }
+        }
+
+        this.ch = (char) ch;
+        this.offset = offset;
+        return decoded;
+    }
+
     @Override
     public final String info(String message) {
         int line = 1, column = 0;
diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONWriter.java b/core/src/main/java/com/alibaba/fastjson2/JSONWriter.java
index 92d0ea94d..06fff5264 100644
--- a/core/src/main/java/com/alibaba/fastjson2/JSONWriter.java
+++ b/core/src/main/java/com/alibaba/fastjson2/JSONWriter.java
@@ -855,6 +855,7 @@ public abstract class JSONWriter
 
     public final void writeNameValue(String name, Object value) {
         writeName(name);
+        writeColon();
         writeAny(value);
     }
 
@@ -1171,8 +1172,12 @@ public abstract class JSONWriter
     }
 
     public void writeArrayNull() {
+        writeArrayNull(this.context.features);
+    }
+
+    public void writeArrayNull(long features) {
         String raw;
-        if ((this.context.features & (MASK_NULL_AS_DEFAULT_VALUE | MASK_WRITE_NULL_LIST_AS_EMPTY)) != 0) {
+        if ((features & (MASK_NULL_AS_DEFAULT_VALUE | MASK_WRITE_NULL_LIST_AS_EMPTY)) != 0) {
             raw = "[]";
         } else {
             raw = "null";
@@ -2723,7 +2728,8 @@ public abstract class JSONWriter
             if (minCapacity < maxArraySize) {
                 newCapacity = maxArraySize;
             } else {
-                throw new OutOfMemoryError("try enabling LargeObject feature instead");
+                throw new JSONLargeObjectException("Maximum array size exceeded. Try enabling LargeObject feature instead. "
+                        + "Requested size: " + minCapacity + ", max size: " + maxArraySize);
             }
         }
         return newCapacity;
diff --git a/core/src/main/java/com/alibaba/fastjson2/SymbolTable.java b/core/src/main/java/com/alibaba/fastjson2/SymbolTable.java
index b83f2f957..afc13a717 100644
--- a/core/src/main/java/com/alibaba/fastjson2/SymbolTable.java
+++ b/core/src/main/java/com/alibaba/fastjson2/SymbolTable.java
@@ -15,6 +15,24 @@ public final class SymbolTable {
     private final long[] hashCodes;
     private final long[] hashCodesOrigin;
 
+    /**
+     * Create a symbol table
+     *
+     * @param input input
+     * @since 2.0.58
+     */
+    public SymbolTable(Class<?>... input) {
+        this(classNames(input));
+    }
+
+    private static String[] classNames(Class... input) {
+        String[] names = new String[input.length];
+        for (int i = 0; i < input.length; i++) {
+            names[i] = input[i].getName();
+        }
+        return names;
+    }
+
     public SymbolTable(String... input) {
         Set<String> set = new TreeSet<>(Arrays.asList(input));
         names = new String[set.size()];
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/FieldReaderObject.java b/core/src/main/java/com/alibaba/fastjson2/reader/FieldReaderObject.java
index ed962ac60..b857996ef 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/FieldReaderObject.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/FieldReaderObject.java
@@ -123,6 +123,7 @@ public class FieldReaderObject<T>
 
         Object value;
         try {
+            char first = jsonReader.current();
             if (jsonReader.nextIfNullOrEmptyString()) {
                 if (defaultValue != null) {
                     value = defaultValue;
@@ -135,7 +136,7 @@ public class FieldReaderObject<T>
                 } else if (fieldClass == Optional.class) {
                     value = Optional.empty();
                 } else {
-                    value = null;
+                    value = first == 'n' ? null : "";
                 }
             } else if (jsonReader.jsonb) {
                 if (fieldClass == Object.class) {
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java
index 046b59ca9..0caa3b5c0 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java
@@ -7,6 +7,7 @@ import com.alibaba.fastjson2.util.Fnv;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.*;
 import java.util.function.Consumer;
@@ -697,6 +698,17 @@ public class ObjectReaderAdapter<T>
                     continue;
                 }
 
+                if (fieldReader.field != null && Modifier.isFinal(fieldReader.field.getModifiers())) {
+                    try {
+                        Object value = fieldReader.method.invoke(object);
+                        if (value instanceof Collection && !((Collection) value).isEmpty()) {
+                            continue;
+                        }
+                    } catch (Exception e) {
+                        // just ignore
+                    }
+                }
+
                 try {
                     if (fieldValue.getClass() == fieldReader.fieldType) {
                         fieldReader.accept(object, fieldValue);
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBaseModule.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBaseModule.java
index 55a47a052..0c2d3a9e0 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBaseModule.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBaseModule.java
@@ -282,11 +282,6 @@ public class ObjectReaderBaseModule
                             processJacksonJsonFormat(beanInfo, annotation);
                         }
                         break;
-                    case "com.fasterxml.jackson.annotation.JsonInclude":
-                        if (useJacksonAnnotation) {
-                            processJacksonJsonInclude(beanInfo, annotation);
-                        }
-                        break;
                     case "com.fasterxml.jackson.annotation.JsonSubTypes":
                         if (useJacksonAnnotation) {
                             processJacksonJsonSubTypes(beanInfo, annotation);
@@ -859,11 +854,6 @@ public class ObjectReaderBaseModule
                             processGsonSerializedName(fieldInfo, annotation);
                         }
                         break;
-                    case "com.fasterxml.jackson.annotation.JsonInclude":
-                        if (useJacksonAnnotation) {
-                            processJacksonJsonInclude(fieldInfo, annotation);
-                        }
-                        break;
                     default:
                         break;
                 }
@@ -2186,6 +2176,8 @@ public class ObjectReaderBaseModule
                     case "com.google.common.collect.ImmutableSet":
                     case "com.google.common.collect.SingletonImmutableSet":
                         return ObjectReaderImplList.of(type, null, 0);
+                    case "cn.hutool.core.lang.tree.Tree":
+                        return ObjectReaderImplMap.of(null, (Class<?>) rawType, 0L);
                 }
 
                 if (rawType == Optional.class) {
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java
index 0a7d6a8b5..a8ebc8b0a 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java
@@ -53,7 +53,6 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -2568,9 +2567,7 @@ public class ObjectReaderCreator {
             }
         }
 
-        boolean list = fieldClass == List.class
-                || fieldClass == ArrayList.class
-                || fieldClass == LinkedList.class
+        boolean list = List.class.isAssignableFrom(fieldClass)
                 || "cn.hutool.json.JSONArray".equals(fieldClass.getName());
         if (list) {
             if (fieldTypeResolved instanceof ParameterizedType) {
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderImplInt8ValueArray.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderImplInt8ValueArray.java
index b45750254..9ebd55a19 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderImplInt8ValueArray.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderImplInt8ValueArray.java
@@ -76,10 +76,14 @@ class ObjectReaderImplInt8ValueArray
         if (jsonReader.isString()) {
             byte[] bytes;
             if ((jsonReader.features(this.features | features) & Base64StringAsByteArray.mask) != 0) {
-                String str = jsonReader.readString();
-                bytes = Base64.getDecoder().decode(str);
+                bytes = jsonReader.readBase64();
             } else {
-                bytes = jsonReader.readBinary();
+                String str = jsonReader.readString();
+                if (str.isEmpty()) {
+                    bytes = null;
+                } else {
+                    throw new JSONException(jsonReader.info("illegal input : " + str));
+                }
             }
 
             if (builder != null) {
@@ -105,6 +109,12 @@ class ObjectReaderImplInt8ValueArray
             bytes = jsonReader.readBinary();
         } else if (jsonReader.isString()) {
             String str = jsonReader.readString();
+            if (str != null) {
+                String prefix = "data:image/jpeg;base64,";
+                if (str.startsWith(prefix)) {
+                    str = str.substring(prefix.length());
+                }
+            }
             bytes = Base64.getDecoder().decode(str);
         } else {
             int entryCnt = jsonReader.startArray();
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java
index 19ff68369..eecdb649f 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java
@@ -6,6 +6,7 @@ import com.alibaba.fastjson2.util.TypeUtils;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.*;
 import java.util.function.BiFunction;
@@ -563,6 +564,17 @@ public class ObjectReaderNoneDefaultConstructor<T>
                     continue;
                 }
 
+                if (fieldReader.field != null && Modifier.isFinal(fieldReader.field.getModifiers())) {
+                    try {
+                        Object value = fieldReader.method.invoke(object);
+                        if (value instanceof Collection && !((Collection) value).isEmpty()) {
+                            continue;
+                        }
+                    } catch (Exception e) {
+                        // just ignore
+                    }
+                }
+
                 Class<?> valueClass = fieldValue.getClass();
                 Class fieldClass = fieldReader.fieldClass;
                 Type fieldType = fieldReader.fieldType;
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderProvider.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderProvider.java
index 347e2363a..deb4d782f 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderProvider.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderProvider.java
@@ -888,8 +888,8 @@ public class ObjectReaderProvider
     }
 
     public void getFieldInfo(FieldInfo fieldInfo, Class objectClass, Method method) {
-        for (ObjectReaderModule module : modules) {
-            ObjectReaderAnnotationProcessor annotationProcessor = module.getAnnotationProcessor();
+        for (int i = 0; i < modules.size(); i++) {
+            ObjectReaderAnnotationProcessor annotationProcessor = modules.get(i).getAnnotationProcessor();
             if (annotationProcessor == null) {
                 continue;
             }
diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderSeeAlso.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderSeeAlso.java
index 191f481bd..90e4421c4 100644
--- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderSeeAlso.java
+++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderSeeAlso.java
@@ -243,7 +243,7 @@ final class ObjectReaderSeeAlso<T>
             JSONReader.Context context = jsonReader.getContext();
             long features3, hash = jsonReader.readFieldNameHashCode();
             JSONReader.AutoTypeBeforeHandler autoTypeFilter = context.getContextAutoTypeBeforeHandler();
-            if (hash == getTypeKeyHash()
+            if ((hash == getTypeKeyHash() || (seeAlsoDefault != null && seeAlsoDefault != Void.class))
                     && ((((features3 = (features | getFeatures() | context.getFeatures())) & JSONReader.Feature.SupportAutoType.mask) != 0) || autoTypeFilter != null)
             ) {
                 ObjectReader reader = null;
diff --git a/core/src/main/java/com/alibaba/fastjson2/schema/AllOf.java b/core/src/main/java/com/alibaba/fastjson2/schema/AllOf.java
index 8ec4bc455..d8121b165 100644
--- a/core/src/main/java/com/alibaba/fastjson2/schema/AllOf.java
+++ b/core/src/main/java/com/alibaba/fastjson2/schema/AllOf.java
@@ -30,7 +30,7 @@ final class AllOf
                 itemSchema = (Boolean) item ? Any.INSTANCE : Any.NOT_ANY;
             } else {
                 JSONObject itemObject = (JSONObject) item;
-                if (!itemObject.containsKey("type") && type != null) {
+                if (!itemObject.containsKey("$ref") && !itemObject.containsKey("type") && type != null) {
                     switch (type) {
                         case String:
                             itemSchema = new StringSchema(itemObject);
diff --git a/core/src/main/java/com/alibaba/fastjson2/schema/NumberSchema.java b/core/src/main/java/com/alibaba/fastjson2/schema/NumberSchema.java
index 721cb13c4..213fe50ac 100644
--- a/core/src/main/java/com/alibaba/fastjson2/schema/NumberSchema.java
+++ b/core/src/main/java/com/alibaba/fastjson2/schema/NumberSchema.java
@@ -280,7 +280,7 @@ public final class NumberSchema
         }
 
         if (maximumLongValue != Long.MIN_VALUE) {
-            object.put(exclusiveMaximum ? "exclusiveMaximum" : "maximum", minimumLongValue);
+            object.put(exclusiveMaximum ? "exclusiveMaximum" : "maximum", maximumLongValue);
         } else if (maximum != null) {
             object.put(exclusiveMaximum ? "exclusiveMaximum" : "maximum", maximum);
         }
diff --git a/core/src/main/java/com/alibaba/fastjson2/util/BeanUtils.java b/core/src/main/java/com/alibaba/fastjson2/util/BeanUtils.java
index 40e6be854..9ef870cdc 100644
--- a/core/src/main/java/com/alibaba/fastjson2/util/BeanUtils.java
+++ b/core/src/main/java/com/alibaba/fastjson2/util/BeanUtils.java
@@ -65,6 +65,7 @@ public abstract class BeanUtils {
             3724195282986200606L,
             3742915795806478647L,
             3977020351318456359L,
+            4775491097662790952L,
             4882459834864833642L,
             6033839080488254886L,
             7981148566008458638L,
diff --git a/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java b/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java
index 1750dc9a5..f5eeb9880 100644
--- a/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java
+++ b/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java
@@ -61,7 +61,6 @@ public class IOUtils {
     };
 
     private static final short ZERO_DOT_LATIN1;
-    private static final int ZERO_DOT_UTF16;
 
     static {
         short[] shorts = new short[]{
@@ -105,7 +104,6 @@ public class IOUtils {
             DIGITS_K_64[i] = c0 + v;
         }
         ZERO_DOT_LATIN1 = UNSAFE.getShort(new byte[] {'0', '.'}, ARRAY_BYTE_BASE_OFFSET);
-        ZERO_DOT_UTF16 = UNSAFE.getInt(new char[] {'0', '.'}, ARRAY_CHAR_BASE_OFFSET);
     }
 
     private static short digitPair(int value) {
@@ -343,11 +341,11 @@ public class IOUtils {
             int unscaleValSize = stringSize(unscaledVal);
             int insertionPoint = unscaleValSize - scale;
             if (insertionPoint == 0) {
-                putIntUnaligned(buf, off, ZERO_DOT_UTF16);
-                off += 2;
+                buf[off++] = '0';
+                buf[off++] = '.';
             } else if (insertionPoint < 0) {
-                putIntUnaligned(buf, off, ZERO_DOT_UTF16);
-                off += 2;
+                buf[off++] = '0';
+                buf[off++] = '.';
 
                 for (int i = 0; i < -insertionPoint; i++) {
                     putChar(buf, off++, '0');
@@ -485,9 +483,9 @@ public class IOUtils {
         return true;
     }
 
-    public static boolean isNumber(char[] chars, int off, int len) {
+    public static boolean isNumber(char[] buf, int off, int len) {
         for (int i = off, end = off + len; i < end; ++i) {
-            char ch = chars[i];
+            char ch = buf[i];
             if (ch == '+' || ch == '-') {
                 if (i != 0) {
                     return false;
@@ -499,9 +497,9 @@ public class IOUtils {
         return true;
     }
 
-    public static boolean isNumber(byte[] chars, int off, int len) {
+    public static boolean isNumber(byte[] buf, int off, int len) {
         for (int i = off, end = off + len; i < end; ++i) {
-            char ch = (char) chars[i];
+            char ch = (char) buf[i];
             if (ch == '+' || ch == '-') {
                 if (i != 0) {
                     return false;
@@ -751,24 +749,24 @@ public class IOUtils {
         return lines;
     }
 
-    public static int writeLocalDate(byte[] bytes, int off, int year, int month, int dayOfMonth) {
+    public static int writeLocalDate(byte[] buf, int off, int year, int month, int dayOfMonth) {
         if (year < 0) {
-            bytes[off++] = '-';
+            buf[off++] = '-';
             year = -year;
         } else if (year > 9999) {
-            bytes[off++] = '+';
+            buf[off++] = '+';
         }
         int y01 = (int) (year * 1374389535L >> 37); //year / 100;
         int y23 = year - y01 * 100;
 
         if (year >= 0 && year < 10000) {
-            writeDigitPair(bytes, off, y01);
+            writeDigitPair(buf, off, y01);
             off += 2;
         } else {
-            off = IOUtils.writeInt32(bytes, off, y01);
+            off = IOUtils.writeInt32(buf, off, y01);
         }
 
-        putLongLE(bytes, off,
+        putLongLE(buf, off,
                 0x2d00002d0000L
                         | digitPair(y23)
                         | ((long) digitPair(month) << 24)
@@ -776,34 +774,34 @@ public class IOUtils {
         return off + 8;
     }
 
-    public static int writeLocalDate(char[] chars, int off, int year, int month, int dayOfMonth) {
+    public static int writeLocalDate(char[] buf, int off, int year, int month, int dayOfMonth) {
         if (year < 0) {
-            chars[off++] = '-';
+            buf[off++] = '-';
             year = -year;
         } else if (year > 9999) {
-            chars[off++] = '+';
+            buf[off++] = '+';
         }
         int y01 = (int) (year * 1374389535L >> 37); // year / 100;
         int y23 = year - y01 * 100;
 
         if (year >= 0 && year < 10000) {
-            writeDigitPair(chars, off, y01);
+            writeDigitPair(buf, off, y01);
             off += 2;
         } else {
-            off = IOUtils.writeInt32(chars, off, y01);
+            off = IOUtils.writeInt32(buf, off, y01);
         }
 
         int p1 = PACKED_DIGITS_UTF16[month & 0x7f];
-        putLongLE(chars, off,
+        putLongLE(buf, off,
                 ((long) (p1 & 0xFFFF) << 48) | ((long) '-' << 32) | PACKED_DIGITS_UTF16[y23 & 0x7f]);
-        putLongLE(chars, off + 4,
+        putLongLE(buf, off + 4,
                 ((long) (p1 & 0xFFFF0000) >> 16) | ((long) '-' << 16) | ((long) PACKED_DIGITS_UTF16[dayOfMonth & 0x7f] << 32));
         return off + 8;
     }
 
-    public static void writeLocalTime(byte[] bytes, int off, int hour, int minute, int second) {
+    public static void writeLocalTime(byte[] buf, int off, int hour, int minute, int second) {
         putLongLE(
-                bytes,
+                buf,
                 off,
                 0x3a00003a0000L
                         | digitPair(hour)
@@ -811,19 +809,19 @@ public class IOUtils {
                         | ((long) digitPair(second) << 48));
     }
 
-    public static int writeLocalTime(byte[] bytes, int off, LocalTime time) {
-        writeLocalTime(bytes, off, time.getHour(), time.getMinute(), time.getSecond());
+    public static int writeLocalTime(byte[] buf, int off, LocalTime time) {
+        writeLocalTime(buf, off, time.getHour(), time.getMinute(), time.getSecond());
         off += 8;
         int nano = time.getNano();
-        return nano != 0 ? writeNano(bytes, off, nano) : off;
+        return nano != 0 ? writeNano(buf, off, nano) : off;
     }
 
-    public static int writeNano(byte[] bytes, int off, int nano) {
+    public static int writeNano(byte[] buf, int off, int nano) {
         final int div = (int) (nano * 274877907L >> 38); //nano / 1000;
         final int div2 = (int) (div * 274877907L >> 38); // div / 1000;
         final int rem1 = nano - div * 1000;
 
-        putIntLE(bytes, off, DIGITS_K_32[div2 & 0x3ff] & 0xffffff00 | '.');
+        putIntLE(buf, off, DIGITS_K_32[div2 & 0x3ff] & 0xffffff00 | '.');
         off += 4;
 
         int v;
@@ -838,23 +836,23 @@ public class IOUtils {
             v = DIGITS_K_32[(div - div2 * 1000) & 0x3ff];
         }
 
-        putShortLE(bytes, off, (short) (v >> 8));
+        putShortLE(buf, off, (short) (v >> 8));
         off += 2;
         if (rem1 == 0) {
-            putByte(bytes, off, (byte) (v >> 24));
+            putByte(buf, off, (byte) (v >> 24));
             return off + 1;
         }
 
-        putIntLE(bytes, off, DIGITS_K_32[rem1] & 0xffffff00 | (v >> 24));
+        putIntLE(buf, off, DIGITS_K_32[rem1] & 0xffffff00 | (v >> 24));
         return off + 4;
     }
 
-    public static int writeNano(char[] chars, int off, int nano) {
+    public static int writeNano(char[] buf, int off, int nano) {
         final int div = (int) (nano * 274877907L >> 38); //nano / 1000;
         final int div2 = (int) (div * 274877907L >> 38); // div / 1000;
         final int rem1 = nano - div * 1000;
 
-        putLongLE(chars, off, DIGITS_K_64[div2 & 0x3ff] & 0xffffffffffff0000L | DOT_X0);
+        putLongLE(buf, off, DIGITS_K_64[div2 & 0x3ff] & 0xffffffffffff0000L | DOT_X0);
         off += 4;
 
         long v;
@@ -869,31 +867,31 @@ public class IOUtils {
             v = DIGITS_K_64[(div - div2 * 1000) & 0x3ff];
         }
 
-        putIntLE(chars, off, (int) (v >> 16));
+        putIntLE(buf, off, (int) (v >> 16));
         off += 2;
         if (rem1 == 0) {
-            putChar(chars, off, (char) (v >> 48));
+            putChar(buf, off, (char) (v >> 48));
             return off + 1;
         }
 
-        putLongLE(chars, off, DIGITS_K_64[rem1 & 0x3ff] & 0xffffffffffff0000L | (v >> 48));
+        putLongLE(buf, off, DIGITS_K_64[rem1 & 0x3ff] & 0xffffffffffff0000L | (v >> 48));
         return off + 4;
     }
 
-    public static void writeLocalTime(char[] chars, int off, int hour, int minute, int second) {
-        writeDigitPair(chars, off, hour);
-        putChar(chars, off + 2, ':');
-        writeDigitPair(chars, off + 3, minute);
-        putChar(chars, off + 5, ':');
-        writeDigitPair(chars, off + 6, second);
+    public static void writeLocalTime(char[] buf, int off, int hour, int minute, int second) {
+        writeDigitPair(buf, off, hour);
+        putChar(buf, off + 2, ':');
+        writeDigitPair(buf, off + 3, minute);
+        putChar(buf, off + 5, ':');
+        writeDigitPair(buf, off + 6, second);
     }
 
-    public static int writeLocalTime(char[] chars, int off, LocalTime time) {
-        writeLocalTime(chars, off, time.getHour(), time.getMinute(), time.getSecond());
+    public static int writeLocalTime(char[] buf, int off, LocalTime time) {
+        writeLocalTime(buf, off, time.getHour(), time.getMinute(), time.getSecond());
         off += 8;
 
         int nano = time.getNano();
-        return nano != 0 ? writeNano(chars, off, nano) : off;
+        return nano != 0 ? writeNano(buf, off, nano) : off;
     }
 
     private static int writeInt4(byte[] buf, int off, int v) {
@@ -1245,20 +1243,20 @@ public class IOUtils {
         return writeInt8(buf, off, (int) (numValue - val * 10000), v1);
     }
 
-    public static byte getByte(byte[] str, int pos) {
-        return UNSAFE.getByte(str, ARRAY_CHAR_BASE_OFFSET + pos);
+    public static byte getByte(byte[] buf, int pos) {
+        return UNSAFE.getByte(buf, ARRAY_BYTE_BASE_OFFSET + pos);
     }
 
     public static char getChar(char[] buf, int pos) {
         return UNSAFE.getChar(buf, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1));
     }
 
-    public static char getChar(byte[] str, int pos) {
-        return UNSAFE.getChar(str, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1));
+    public static char getChar(byte[] buf, int pos) {
+        return UNSAFE.getChar(buf, ARRAY_BYTE_BASE_OFFSET + ((long) pos << 1));
     }
 
     private static void putByte(byte[] buf, int pos, byte v) {
-        UNSAFE.putByte(buf, ARRAY_CHAR_BASE_OFFSET + pos, v);
+        UNSAFE.putByte(buf, ARRAY_BYTE_BASE_OFFSET + pos, v);
     }
 
     private static void putChar(char[] buf, int pos, char v) {
@@ -1295,7 +1293,7 @@ public class IOUtils {
     }
 
     public static void putShortUnaligned(byte[] buf, int pos, short v) {
-        UNSAFE.putShort(buf, ARRAY_CHAR_BASE_OFFSET + pos, v);
+        UNSAFE.putShort(buf, ARRAY_BYTE_BASE_OFFSET + pos, v);
     }
 
     public static void putIntUnaligned(char[] buf, int pos, int v) {
@@ -1326,26 +1324,26 @@ public class IOUtils {
         UNSAFE.putLong(buf, ARRAY_BYTE_BASE_OFFSET + pos, convEndian(false, v));
     }
 
-    public static int putBoolean(byte[] bytes, int off, boolean v) {
+    public static int putBoolean(byte[] buf, int off, boolean v) {
         long address = ARRAY_BYTE_BASE_OFFSET + off;
         if (v) {
-            UNSAFE.putInt(bytes, address, TRUE);
+            UNSAFE.putInt(buf, address, TRUE);
             return off + 4;
         } else {
-            UNSAFE.putByte(bytes, address, (byte) 'f');
-            UNSAFE.putInt(bytes, address + 1, ALSE);
+            UNSAFE.putByte(buf, address, (byte) 'f');
+            UNSAFE.putInt(buf, address + 1, ALSE);
             return off + 5;
         }
     }
 
-    public static int putBoolean(char[] chars, int off, boolean v) {
+    public static int putBoolean(char[] buf, int off, boolean v) {
         long address = ARRAY_CHAR_BASE_OFFSET + ((long) off << 1);
         if (v) {
-            UNSAFE.putLong(chars, address, TRUE_64);
+            UNSAFE.putLong(buf, address, TRUE_64);
             return off + 4;
         } else {
-            UNSAFE.putChar(chars, address, 'f');
-            UNSAFE.putLong(chars, address + 2, ALSE_64);
+            UNSAFE.putChar(buf, address, 'f');
+            UNSAFE.putLong(buf, address + 2, ALSE_64);
             return off + 5;
         }
     }
@@ -1383,11 +1381,11 @@ public class IOUtils {
     }
 
     public static boolean isTRUE(char[] buf, int pos) {
-        return UNSAFE.getLong(buf, ARRAY_BYTE_BASE_OFFSET + ((long) pos << 1)) == TRUE_64;
+        return UNSAFE.getLong(buf, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1)) == TRUE_64;
     }
 
     public static boolean notTRUE(char[] buf, int pos) {
-        return UNSAFE.getLong(buf, ARRAY_BYTE_BASE_OFFSET + ((long) pos << 1)) != TRUE_64;
+        return UNSAFE.getLong(buf, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1)) != TRUE_64;
     }
 
     public static boolean isNULL(char[] buf, int pos) {
@@ -1399,15 +1397,15 @@ public class IOUtils {
     }
 
     public static void putNULL(byte[] buf, int pos) {
-        UNSAFE.putInt(buf, ARRAY_CHAR_BASE_OFFSET + pos, NULL_32);
+        UNSAFE.putInt(buf, ARRAY_BYTE_BASE_OFFSET + pos, NULL_32);
     }
 
     public static void putNULL(char[] buf, int pos) {
         UNSAFE.putLong(buf, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1), NULL_64);
     }
 
-    public static int digit4(char[] chars, int off) {
-        long x = getLongLE(chars, off);
+    public static int digit4(char[] buf, int off) {
+        long x = getLongLE(buf, off);
         long d;
         if ((((x & 0xFFF0FFF0FFF0FFF0L) - 0x30003000300030L) | (((d = x & 0x0F000F000F000FL) + 0x06000600060006L) & 0xF000F000F000F0L)) != 0) {
             return -1;
@@ -1419,9 +1417,9 @@ public class IOUtils {
                 (d >> 48));
     }
 
-    public static int digit4(byte[] bytes, int off) {
+    public static int digit4(byte[] buf, int off) {
         return digit4(
-                getIntLE(bytes, off)
+                getIntLE(buf, off)
         );
     }
 
@@ -1465,8 +1463,8 @@ public class IOUtils {
                 (d >> 24);
     }
 
-    public static int digit3(char[] chars, int off) {
-        long x = getIntLE(chars, off) + (((long) getChar(chars, off + 2)) << 32);
+    public static int digit3(char[] buf, int off) {
+        long x = getIntLE(buf, off) + (((long) getChar(buf, off + 2)) << 32);
         long d;
         if ((((x & 0xFFF0FFF0FFF0L) - 0x3000300030L) | (((d = x & 0x0F000F000FL) + 0x0600060006L) & 0xF000F000F0L)) != 0) {
             return -1;
@@ -1474,9 +1472,9 @@ public class IOUtils {
         return (int) (((d & 0xF) * 10 + ((d >> 16) & 0xF)) * 10 + (d >> 32));
     }
 
-    public static int digit3(byte[] bytes, int off) {
+    public static int digit3(byte[] buf, int off) {
         return digit3(
-                getShortLE(bytes, off) | (getByte(bytes, off + 2) << 16)
+                getShortLE(buf, off) | (getByte(buf, off + 2) << 16)
         );
     }
 
@@ -1488,8 +1486,8 @@ public class IOUtils {
         return ((d & 0xF) * 10 + ((d >> 8) & 0xF)) * 10 + (d >> 16);
     }
 
-    public static int digit2(char[] chars, int off) {
-        int x = UNSAFE.getInt(chars, ARRAY_CHAR_BASE_OFFSET + ((long) off << 1));
+    public static int digit2(char[] buf, int off) {
+        int x = UNSAFE.getInt(buf, ARRAY_CHAR_BASE_OFFSET + ((long) off << 1));
         if (BIG_ENDIAN) {
             x = Integer.reverseBytes(x);
         }
@@ -1500,8 +1498,8 @@ public class IOUtils {
         return (d & 0xF) * 10 + (d >> 16);
     }
 
-    public static int digit2(byte[] bytes, int off) {
-        short x = UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + off);
+    public static int digit2(byte[] buf, int off) {
+        short x = UNSAFE.getShort(buf, ARRAY_BYTE_BASE_OFFSET + off);
         if (BIG_ENDIAN) {
             x = Short.reverseBytes(x);
         }
@@ -1512,16 +1510,16 @@ public class IOUtils {
         return (d & 0xF) * 10 + (d >> 8);
     }
 
-    public static boolean isDigit2(byte[] bytes, int off) {
-        short x = UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + off);
+    public static boolean isDigit2(byte[] buf, int off) {
+        short x = UNSAFE.getShort(buf, ARRAY_BYTE_BASE_OFFSET + off);
         if (BIG_ENDIAN) {
             x = Short.reverseBytes(x);
         }
         return (((x & 0xF0F0) - 0x3030) | (((x & 0x0F0F) + 0x0606) & 0xF0F0)) == 0;
     }
 
-    public static boolean isDigit2(char[] bytes, int off) {
-        int x = UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + ((long) off << 1));
+    public static boolean isDigit2(char[] buf, int off) {
+        int x = UNSAFE.getShort(buf, ARRAY_CHAR_BASE_OFFSET + ((long) off << 1));
         if (BIG_ENDIAN) {
             x = Integer.reverseBytes(x);
         }
@@ -1532,117 +1530,117 @@ public class IOUtils {
         return d >= 0 && d <= 9 ? d : -1;
     }
 
-    public static int digit1(char[] chars, int off) {
-        int d = UNSAFE.getByte(chars, ARRAY_CHAR_BASE_OFFSET + ((long) off << 1)) - '0';
+    public static int digit1(char[] buf, int off) {
+        int d = UNSAFE.getByte(buf, ARRAY_CHAR_BASE_OFFSET + ((long) off << 1)) - '0';
         return d >= 0 && d <= 9 ? d : -1;
     }
 
-    public static int digit1(byte[] bytes, int off) {
-        int d = UNSAFE.getByte(bytes, ARRAY_BYTE_BASE_OFFSET + off) - '0';
+    public static int digit1(byte[] buf, int off) {
+        int d = UNSAFE.getByte(buf, ARRAY_BYTE_BASE_OFFSET + off) - '0';
         return d >= 0 && d <= 9 ? d : -1;
     }
 
-    public static int indexOfQuote(byte[] value, int quote, int fromIndex, int max) {
+    public static int indexOfQuote(byte[] buf, int quote, int fromIndex, int max) {
         if (INDEX_OF_CHAR_LATIN1 == null) {
-            return indexOfQuoteV(value, quote, fromIndex, max);
+            return indexOfQuoteV(buf, quote, fromIndex, max);
         }
         try {
-            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(value, quote, fromIndex, max);
+            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(buf, quote, fromIndex, max);
         } catch (Throwable e) {
             throw new JSONException(e.getMessage());
         }
     }
 
-    public static int indexOfQuoteV(byte[] value, int quote, int fromIndex, int max) {
+    public static int indexOfQuoteV(byte[] buf, int quote, int fromIndex, int max) {
         int i = fromIndex;
         long address = ARRAY_BYTE_BASE_OFFSET + fromIndex;
         int upperBound = fromIndex + ((max - fromIndex) & ~7);
         long vectorQuote = quote == '\'' ? 0x2727_2727_2727_2727L : 0x2222_2222_2222_2222L;
-        while (i < upperBound && notContains(UNSAFE.getLong(value, address), vectorQuote)) {
+        while (i < upperBound && notContains(UNSAFE.getLong(buf, address), vectorQuote)) {
             i += 8;
             address += 8;
         }
-        return indexOfChar(value, quote, i, max);
+        return indexOfChar(buf, quote, i, max);
     }
 
-    public static int indexOfDoubleQuote(byte[] value, int fromIndex, int max) {
+    public static int indexOfDoubleQuote(byte[] buf, int fromIndex, int max) {
         if (INDEX_OF_CHAR_LATIN1 == null) {
-            return indexOfDoubleQuoteV(value, fromIndex, max);
+            return indexOfDoubleQuoteV(buf, fromIndex, max);
         }
         try {
-            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(value, (int) '"', fromIndex, max);
+            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(buf, (int) '"', fromIndex, max);
         } catch (Throwable e) {
             throw new JSONException(e.getMessage());
         }
     }
 
-    public static int indexOfDoubleQuoteV(byte[] value, int fromIndex, int max) {
+    public static int indexOfDoubleQuoteV(byte[] buf, int fromIndex, int max) {
         int i = fromIndex;
         long address = ARRAY_BYTE_BASE_OFFSET + fromIndex;
         int upperBound = fromIndex + ((max - fromIndex) & ~7);
-        while (i < upperBound && notContains(UNSAFE.getLong(value, address), 0x2222_2222_2222_2222L)) {
+        while (i < upperBound && notContains(UNSAFE.getLong(buf, address), 0x2222_2222_2222_2222L)) {
             i += 8;
             address += 8;
         }
-        return indexOfChar(value, '"', i, max);
+        return indexOfChar(buf, '"', i, max);
     }
 
-    public static int indexOfLineSeparator(byte[] value, int fromIndex, int max) {
+    public static int indexOfLineSeparator(byte[] buf, int fromIndex, int max) {
         if (INDEX_OF_CHAR_LATIN1 == null) {
-            return indexOfLineSeparatorV(value, fromIndex, max);
+            return indexOfLineSeparatorV(buf, fromIndex, max);
         }
         try {
-            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(value, (int) '\n', fromIndex, max);
+            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(buf, (int) '\n', fromIndex, max);
         } catch (Throwable e) {
             throw new JSONException(e.getMessage());
         }
     }
 
-    public static int indexOfLineSeparatorV(byte[] value, int fromIndex, int max) {
+    public static int indexOfLineSeparatorV(byte[] buf, int fromIndex, int max) {
         int i = fromIndex;
         long address = ARRAY_BYTE_BASE_OFFSET + fromIndex;
         int upperBound = fromIndex + ((max - fromIndex) & ~7);
-        while (i < upperBound && notContains(UNSAFE.getLong(value, address), 0x0A0A0A0A0A0A0A0AL)) {
+        while (i < upperBound && notContains(UNSAFE.getLong(buf, address), 0x0A0A0A0A0A0A0A0AL)) {
             i += 8;
             address += 8;
         }
-        return indexOfChar(value, '\n', i, max);
+        return indexOfChar(buf, '\n', i, max);
     }
 
-    public static int indexOfSlash(byte[] value, int fromIndex, int max) {
+    public static int indexOfSlash(byte[] buf, int fromIndex, int max) {
         if (INDEX_OF_CHAR_LATIN1 == null) {
-            return indexOfSlashV(value, fromIndex, max);
+            return indexOfSlashV(buf, fromIndex, max);
         }
         try {
-            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(value, (int) '\\', fromIndex, max);
+            return (int) INDEX_OF_CHAR_LATIN1.invokeExact(buf, (int) '\\', fromIndex, max);
         } catch (Throwable e) {
             throw new JSONException(e.getMessage());
         }
     }
 
-    public static int indexOfSlashV(byte[] value, int fromIndex, int max) {
+    public static int indexOfSlashV(byte[] buf, int fromIndex, int max) {
         int i = fromIndex;
         long address = ARRAY_BYTE_BASE_OFFSET + fromIndex;
         int upperBound = fromIndex + ((max - fromIndex) & ~7);
-        while (i < upperBound && notContains(UNSAFE.getLong(value, address), 0x5C5C5C5C5C5C5C5CL)) {
+        while (i < upperBound && notContains(UNSAFE.getLong(buf, address), 0x5C5C5C5C5C5C5C5CL)) {
             i += 8;
             address += 8;
         }
-        return indexOfChar(value, '\\', i, max);
+        return indexOfChar(buf, '\\', i, max);
     }
 
-    public static int indexOfChar(byte[] value, int ch, int fromIndex, int max) {
+    public static int indexOfChar(byte[] buf, int ch, int fromIndex, int max) {
         for (int i = fromIndex; i < max; i++) {
-            if (value[i] == ch) {
+            if (buf[i] == ch) {
                 return i;
             }
         }
         return -1;
     }
 
-    public static int indexOfChar(char[] value, int ch, int fromIndex, int max) {
+    public static int indexOfChar(char[] buf, int ch, int fromIndex, int max) {
         for (int i = fromIndex; i < max; i++) {
-            if (value[i] == ch) {
+            if (buf[i] == ch) {
                 return i;
             }
         }
@@ -1664,14 +1662,14 @@ public class IOUtils {
         return (((x - 0x0101010101010101L) & ~x) & 0x8080808080808080L) == 0;
     }
 
-    public static int hexDigit4(byte[] bytes, int offset) {
-        int v = getIntLE(bytes, offset);
+    public static int hexDigit4(byte[] buf, int offset) {
+        int v = getIntLE(buf, offset);
         v = (v & 0x0F0F0F0F) + ((((v & 0x40404040) >> 2) | ((v & 0x40404040) << 1)) >>> 4);
         return ((v & 0xF000000) >>> 24) + ((v & 0xF0000) >>> 12) + (v & 0xF00) + ((v & 0xF) << 12);
     }
 
-    public static int hexDigit4(char[] bytes, int offset) {
-        long v = getLongLE(bytes, offset);
+    public static int hexDigit4(char[] buf, int offset) {
+        long v = getLongLE(buf, offset);
         v = (v & 0x000F_000F_000F_000FL) + ((((v & 0x0004_0004_0004_00040L) >> 2) | ((v & 0x0004_0004_0004_00040L) << 1)) >>> 4);
         return (int) (((v & 0xF_0000_0000_0000L) >>> 48) + ((v & 0xF_0000_0000L) >>> 28) + ((v & 0xF_0000) >> 8) + ((v & 0xF) << 12));
     }
@@ -1680,80 +1678,80 @@ public class IOUtils {
         return ch >= '0' && ch <= '9';
     }
 
-    public static short getShortUnaligned(byte[] bytes, int offset) {
-        return UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static short getShortUnaligned(byte[] buf, int offset) {
+        return UNSAFE.getShort(buf, ARRAY_BYTE_BASE_OFFSET + offset);
     }
 
-    public static short getShortBE(byte[] bytes, int offset) {
+    public static short getShortBE(byte[] buf, int offset) {
         return convEndian(true,
-                UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + offset));
+                UNSAFE.getShort(buf, ARRAY_BYTE_BASE_OFFSET + offset));
     }
 
-    public static short getShortLE(byte[] bytes, int offset) {
+    public static short getShortLE(byte[] buf, int offset) {
         return convEndian(false,
-                UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + offset));
+                UNSAFE.getShort(buf, ARRAY_BYTE_BASE_OFFSET + offset));
     }
 
-    public static boolean isUTF8BOM(byte[] bytes, int off) {
+    public static boolean isUTF8BOM(byte[] buf, int off) {
         // EF BB BF
-        return ((getIntLE(bytes, off)) & 0xFFFFFF) == 0xBFBBEF;
+        return ((getIntLE(buf, off)) & 0xFFFFFF) == 0xBFBBEF;
     }
 
-    public static int getIntBE(byte[] bytes, int offset) {
-        int v = UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static int getIntBE(byte[] buf, int offset) {
+        int v = UNSAFE.getInt(buf, ARRAY_BYTE_BASE_OFFSET + offset);
         if (!BIG_ENDIAN) {
             v = Integer.reverseBytes(v);
         }
         return v;
     }
 
-    public static int getIntLE(byte[] bytes, int offset) {
-        int v = UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static int getIntLE(byte[] buf, int offset) {
+        int v = UNSAFE.getInt(buf, ARRAY_BYTE_BASE_OFFSET + offset);
         if (BIG_ENDIAN) {
             v = Integer.reverseBytes(v);
         }
         return v;
     }
 
-    public static int getIntLE(char[] bytes, int offset) {
-        int v = UNSAFE.getInt(bytes, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
+    public static int getIntLE(char[] buf, int offset) {
+        int v = UNSAFE.getInt(buf, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
         if (BIG_ENDIAN) {
             v = Integer.reverseBytes(v);
         }
         return v;
     }
 
-    public static int getIntUnaligned(byte[] bytes, int offset) {
-        return UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static int getIntUnaligned(byte[] buf, int offset) {
+        return UNSAFE.getInt(buf, ARRAY_BYTE_BASE_OFFSET + offset);
     }
 
-    public static int getIntUnaligned(char[] bytes, int offset) {
-        return UNSAFE.getInt(bytes, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
+    public static int getIntUnaligned(char[] buf, int offset) {
+        return UNSAFE.getInt(buf, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
     }
 
-    public static long getLongBE(byte[] bytes, int offset) {
-        long v = UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static long getLongBE(byte[] buf, int offset) {
+        long v = UNSAFE.getLong(buf, ARRAY_BYTE_BASE_OFFSET + offset);
         if (!BIG_ENDIAN) {
             v = Long.reverseBytes(v);
         }
         return v;
     }
 
-    public static long getLongUnaligned(byte[] bytes, int offset) {
-        return UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET + offset);
+    public static long getLongUnaligned(byte[] buf, int offset) {
+        return UNSAFE.getLong(buf, ARRAY_BYTE_BASE_OFFSET + offset);
     }
 
-    public static long getLongUnaligned(char[] bytes, int offset) {
-        return UNSAFE.getLong(bytes, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
+    public static long getLongUnaligned(char[] buf, int offset) {
+        return UNSAFE.getLong(buf, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
     }
 
-    public static long getLongLE(byte[] bytes, int offset) {
+    public static long getLongLE(byte[] buf, int offset) {
         return convEndian(false,
-                UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET + offset));
+                UNSAFE.getLong(buf, ARRAY_BYTE_BASE_OFFSET + offset));
     }
 
-    public static long getLongLE(char[] bytes, int offset) {
-        long v = UNSAFE.getLong(bytes, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
+    public static long getLongLE(char[] buf, int offset) {
+        long v = UNSAFE.getLong(buf, ARRAY_CHAR_BASE_OFFSET + ((long) offset << 1));
         if (BIG_ENDIAN) {
             v = Long.reverseBytes(v);
         }
@@ -1854,18 +1852,18 @@ public class IOUtils {
         return big == BIG_ENDIAN ? n : Short.reverseBytes(n);
     }
 
-    public static boolean isLatin1(char[] chars, int off, int len) {
+    public static boolean isLatin1(char[] buf, int off, int len) {
         int end = off + len;
         int upperBound = off + (len & ~7);
         long address = ARRAY_CHAR_BASE_OFFSET + ((long) off << 1);
         while (off < upperBound
-                && (convEndian(false, UNSAFE.getLong(chars, address) | UNSAFE.getLong(chars, address + 8)) & 0xFF00FF00FF00FF00L) == 0
+                && (convEndian(false, UNSAFE.getLong(buf, address) | UNSAFE.getLong(buf, address + 8)) & 0xFF00FF00FF00FF00L) == 0
         ) {
             address += 16;
             off += 8;
         }
         while (off++ < end) {
-            if ((convEndian(false, UNSAFE.getShort(chars, address)) & 0xFF00) != 0) {
+            if ((convEndian(false, UNSAFE.getShort(buf, address)) & 0xFF00) != 0) {
                 return false;
             }
             address += 2;
@@ -1885,40 +1883,40 @@ public class IOUtils {
         return true;
     }
 
-    public static boolean isASCII(byte[] bytes) {
-        return isASCII(bytes, 0, bytes.length);
+    public static boolean isASCII(byte[] buf) {
+        return isASCII(buf, 0, buf.length);
     }
 
-    public static boolean isASCII(byte[] bytes, int off, int len) {
+    public static boolean isASCII(byte[] buf, int off, int len) {
         int end = off + len;
         int upperBound = off + (len & ~7);
         long address = ARRAY_BYTE_BASE_OFFSET + off;
-        while (off < upperBound && (UNSAFE.getLong(bytes, address) & 0x8080808080808080L) == 0) {
+        while (off < upperBound && (UNSAFE.getLong(buf, address) & 0x8080808080808080L) == 0) {
             address += 8;
             off += 8;
         }
 
         while (off++ < end) {
-            if ((UNSAFE.getByte(bytes, address++) & 0x80) != 0) {
+            if ((UNSAFE.getByte(buf, address++) & 0x80) != 0) {
                 return false;
             }
         }
         return true;
     }
 
-    public static boolean isNonSlashASCII(byte[] bytes, int off, int len) {
+    public static boolean isNonSlashASCII(byte[] buf, int off, int len) {
         int end = off + len;
         int upperBound = off + (len & ~7);
         long addr = ARRAY_BYTE_BASE_OFFSET + off;
         long d, x;
         while (off < upperBound
-                && (((d = UNSAFE.getLong(bytes, addr)) | (((x = d ^ 0x5C5C5C5C5C5C5C5CL) - 0x0101010101010101L) & ~x)) & 0x8080808080808080L) == 0) {
+                && (((d = UNSAFE.getLong(buf, addr)) | (((x = d ^ 0x5C5C5C5C5C5C5C5CL) - 0x0101010101010101L) & ~x)) & 0x8080808080808080L) == 0) {
             addr += 8;
             off += 8;
         }
         while (off++ < end) {
             byte b;
-            if (((b = UNSAFE.getByte(bytes, addr++)) & 0x80) != 0 || b == '\\') {
+            if (((b = UNSAFE.getByte(buf, addr++)) & 0x80) != 0 || b == '\\') {
                 return false;
             }
         }
@@ -1929,8 +1927,8 @@ public class IOUtils {
         return c >= '0' && c <= '9';
     }
 
-    public static int parseInt(byte[] bytes, int off, int len) {
-        int fc = bytes[off];
+    public static int parseInt(byte[] buf, int off, int len) {
+        int fc = buf[off];
         int result = isDigitLatin1(fc)
                 ? '0' - fc
                 : len != 1 && (fc == '-' || fc == '+')
@@ -1940,13 +1938,13 @@ public class IOUtils {
         off++;
         int d;
         while (off + 1 < end
-                && (d = IOUtils.digit2(bytes, off)) != -1
+                && (d = IOUtils.digit2(buf, off)) != -1
                 && Integer.MIN_VALUE / 100 <= result & result <= 0) {
             result = result * 100 - d;  // overflow from d => result > 0
             off += 2;
         }
         if (off < end
-                && isDigitLatin1(d = bytes[off])
+                && isDigitLatin1(d = buf[off])
                 && Integer.MIN_VALUE / 10 <= result & result <= 0) {
             result = result * 10 + '0' - d;  // overflow from '0' - d => result > 0
             off += 1;
@@ -1956,6 +1954,6 @@ public class IOUtils {
                 & (Integer.MIN_VALUE < result || fc == '-')) {
             return fc == '-' ? result : -result;
         }
-        throw new NumberFormatException(new String(bytes, off, len));
+        throw new NumberFormatException(new String(buf, off, len));
     }
 }
diff --git a/core/src/main/java/com/alibaba/fastjson2/util/JDKUtils.java b/core/src/main/java/com/alibaba/fastjson2/util/JDKUtils.java
index 8d6f8db5a..33d470b38 100644
--- a/core/src/main/java/com/alibaba/fastjson2/util/JDKUtils.java
+++ b/core/src/main/java/com/alibaba/fastjson2/util/JDKUtils.java
@@ -70,22 +70,19 @@ public class JDKUtils {
 
     static {
         Unsafe unsafe;
-        long offset, charOffset;
         try {
             Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
             theUnsafeField.setAccessible(true);
             unsafe = (Unsafe) theUnsafeField.get(null);
-            offset = unsafe.arrayBaseOffset(byte[].class);
-            charOffset = unsafe.arrayBaseOffset(char[].class);
+            ARRAY_BYTE_BASE_OFFSET = unsafe.arrayBaseOffset(byte[].class);
+            ARRAY_CHAR_BASE_OFFSET = unsafe.arrayBaseOffset(char[].class);
         } catch (Throwable e) {
             throw new JSONException("init unsafe error", e);
         }
 
         UNSAFE = unsafe;
-        ARRAY_BYTE_BASE_OFFSET = offset;
-        ARRAY_CHAR_BASE_OFFSET = charOffset;
 
-        if (offset == -1) {
+        if (ARRAY_BYTE_BASE_OFFSET == -1 || ARRAY_CHAR_BASE_OFFSET == -1) {
             throw new JSONException("init JDKUtils error", initErrorLast);
         }
 
diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListStrFunc.java b/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListStrFunc.java
index acabbdc3e..b65962691 100644
--- a/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListStrFunc.java
+++ b/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterListStrFunc.java
@@ -51,7 +51,7 @@ final class FieldWriterListStrFunc<T>
         if (list == null) {
             if ((features & (WriteNulls.mask | NullAsDefaultValue.mask | WriteNullListAsEmpty.mask)) != 0) {
                 writeFieldName(jsonWriter);
-                jsonWriter.writeArrayNull();
+                jsonWriter.writeArrayNull(features);
                 return true;
             } else {
                 return false;
diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterObject.java b/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterObject.java
index 9817721d0..7522f17c3 100644
--- a/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterObject.java
+++ b/core/src/main/java/com/alibaba/fastjson2/writer/FieldWriterObject.java
@@ -25,6 +25,7 @@ public class FieldWriterObject<T>
     final boolean unwrapped;
     final boolean array;
     final boolean number;
+    protected boolean writeUsing;
 
     static final AtomicReferenceFieldUpdater<FieldWriterObject, Class> initValueClassUpdater = AtomicReferenceFieldUpdater.newUpdater(
             FieldWriterObject.class,
@@ -76,7 +77,7 @@ public class FieldWriterObject<T>
             return getObjectWriterVoid(jsonWriter, valueClass);
         } else {
             boolean typeMatch = initValueClass == valueClass
-                    || (initValueClass.isAssignableFrom(valueClass) && !jsonWriter.isEnabled(WriteClassName) && fieldType instanceof Class)
+                    || (writeUsing && initValueClass.isAssignableFrom(valueClass))
                     || (initValueClass == Map.class && initValueClass.isAssignableFrom(valueClass))
                     || (initValueClass == List.class && initValueClass.isAssignableFrom(valueClass));
             if (!typeMatch && initValueClass.isPrimitive()) {
diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java
index 4269769b0..f6f9cc94f 100644
--- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java
+++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterAdapter.java
@@ -687,7 +687,11 @@ public class ObjectWriterAdapter<T>
                 }
                 if (valueWriter instanceof ObjectWriterAdapter) {
                     ObjectWriterAdapter objectWriterAdapter = (ObjectWriterAdapter) valueWriter;
-                    fieldValue = objectWriterAdapter.toJSONObject(fieldValue);
+                    if (!objectWriterAdapter.getFieldWriters().isEmpty()) {
+                        fieldValue = objectWriterAdapter.toJSONObject(fieldValue);
+                    } else {
+                        fieldValue = JSON.toJSON(fieldValue);
+                    }
                 }
             }
             jsonObject.put(fieldWriter.fieldName, fieldValue);
diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java
index 1eff38c39..23e151e34 100644
--- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java
+++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java
@@ -353,6 +353,9 @@ public class ObjectWriterCreator {
                 fieldInfo.init();
                 FieldWriter fieldWriter = creteFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field);
                 if (fieldWriter != null) {
+                    if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                        ((FieldWriterObject) fieldWriter).writeUsing = true;
+                    }
                     fieldWriterMap.put(fieldWriter.fieldName, fieldWriter);
                 }
             });
@@ -376,6 +379,9 @@ public class ObjectWriterCreator {
                         fieldInfo.ignore = (field.getModifiers() & Modifier.PUBLIC) == 0;
                         FieldWriter fieldWriter = creteFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field);
                         if (fieldWriter != null) {
+                            if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                                ((FieldWriterObject) fieldWriter).writeUsing = true;
+                            }
                             FieldWriter origin = fieldWriterMap.putIfAbsent(fieldWriter.fieldName, fieldWriter);
 
                             if (origin != null && origin.compareTo(fieldWriter) > 0) {
@@ -490,6 +496,9 @@ public class ObjectWriterCreator {
                         );
                     }
 
+                    if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                        ((FieldWriterObject) fieldWriter).writeUsing = true;
+                    }
                     FieldWriter origin = fieldWriterMap.putIfAbsent(fieldWriter.fieldName, fieldWriter);
 
                     if (origin != null && origin.compareTo(fieldWriter) > 0) {
diff --git a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java
index a69e2511f..308b5aba5 100644
--- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java
+++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java
@@ -226,6 +226,9 @@ public class ObjectWriterCreatorASM
 
                         FieldWriter fieldWriter = creteFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field);
                         if (fieldWriter != null) {
+                            if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                                ((FieldWriterObject) fieldWriter).writeUsing = true;
+                            }
                             FieldWriter origin = fieldWriterMap.putIfAbsent(fieldWriter.fieldName, fieldWriter);
                             if (origin != null) {
                                 int cmp = origin.compareTo(fieldWriter);
@@ -347,6 +350,9 @@ public class ObjectWriterCreatorASM
                         );
                     }
 
+                    if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                        ((FieldWriterObject) fieldWriter).writeUsing = true;
+                    }
                     FieldWriter origin = fieldWriterMap.putIfAbsent(fieldName, fieldWriter);
 
                     if (origin != null && origin.compareTo(fieldWriter) > 0) {
@@ -374,6 +380,9 @@ public class ObjectWriterCreatorASM
                 fieldInfo.init();
                 FieldWriter fieldWriter = creteFieldWriter(objectClass, writerFieldFeatures, provider, beanInfo, fieldInfo, field);
                 if (fieldWriter != null) {
+                    if (fieldInfo.writeUsing != null && fieldWriter instanceof FieldWriterObject) {
+                        ((FieldWriterObject) fieldWriter).writeUsing = true;
+                    }
                     fieldWriterMap.put(fieldWriter.fieldName, fieldWriter);
                 }
             });
@@ -2452,7 +2461,6 @@ public class ObjectWriterCreatorASM
             int i
     ) {
         Class<?> fieldClass = fieldWriter.fieldClass;
-        boolean writeAsString = (fieldWriter.features & WriteNonStringValueAsString.mask) != 0;
 
         if (fieldClass == boolean.class) {
             gwFieldValueBooleanV(mwc, fieldWriter, OBJECT, i, false);
@@ -3024,14 +3032,17 @@ public class ObjectWriterCreatorASM
         mw.goto_(notNull_);
 
         mw.visitLabel(null_);
-        mwc.genIsEnabled(WriteNulls.mask | NullAsDefaultValue.mask | WriteNullListAsEmpty.mask, notNull_);
+        mwc.genIsEnabled(fieldWriter.features, WriteNulls.mask | NullAsDefaultValue.mask | WriteNullListAsEmpty.mask, notNull_);
 
         // writeFieldName(w);
         gwFieldName(mwc, fieldWriter, i);
 
         // jw.writeNull
         mw.aload(JSON_WRITER);
-        mw.invokevirtual(TYPE_JSON_WRITER, "writeArrayNull", "()V");
+        mw.lload(mwc.var2(CONTEXT_FEATURES));
+        mw.visitLdcInsn(fieldWriter.features);
+        mw.lor();
+        mw.invokevirtual(TYPE_JSON_WRITER, "writeArrayNull", "(J)V");
 
         mw.visitLabel(notNull_);
     }
@@ -5018,6 +5029,19 @@ public class ObjectWriterCreatorASM
             }
         }
 
+        void genIsEnabled(long fieldFeatures, long features, Label elseLabel) {
+            mw.lload(var2(CONTEXT_FEATURES));
+            mw.visitLdcInsn(fieldFeatures);
+            mw.lor();
+            mw.visitLdcInsn(features);
+            mw.land();
+            mw.lconst_0();
+            mw.lcmp();
+            if (elseLabel != null) {
+                mw.ifeq(elseLabel);
+            }
+        }
+
         void genIsDisabled(long features, Label elseLabel) {
             mw.lload(var2(CONTEXT_FEATURES));
             mw.visitLdcInsn(features);
diff --git a/docs/fastjson_1_upgrade_cn.md b/docs/fastjson_1_upgrade_cn.md
index 052733a42..66eebb6e5 100644
--- a/docs/fastjson_1_upgrade_cn.md
+++ b/docs/fastjson_1_upgrade_cn.md
@@ -103,8 +103,8 @@ FASTJSON v2中有比较完善的扩展机制，如下：
 | com.alibaba.fastjson.serializer.SerializeConfig             | com.alibaba.fastjson2.writer.ObjectWriterProvider     |
 | com.alibaba.fastjson.serializer.ToStringSerializer          | com.alibaba.fastjson2.writer.ObjectWriterImplToString |
 | com.alibaba.fastjson.serializer.ValueFilter                 | com.alibaba.fastjson2.filter.ValueFilter              |
-| com.alibaba.fastjson.serializer.SerializerFeature           | com.alibaba.fastjson2.JSONReader.Feature              |
-| com.alibaba.fastjson.parser.Feature                         | com.alibaba.fastjson2.JSONWriter.Feature              |
+| com.alibaba.fastjson.serializer.SerializerFeature           | com.alibaba.fastjson2.JSONWriter.Feature              |
+| com.alibaba.fastjson.parser.Feature                         | com.alibaba.fastjson2.JSONReader.Feature              |
 
 
 ### 3.4 SerializerFeature.UseISO8601DateFormat在fastjson2的替代方案
diff --git a/docs/maven_deploy_guide.md b/docs/maven_deploy_guide.md
index b314e2ea9..589bfe3a8 100644
--- a/docs/maven_deploy_guide.md
+++ b/docs/maven_deploy_guide.md
@@ -4,12 +4,12 @@
 
 ## 0. 前置准备与配置
 
-在`Maven`的`settting.xml`中配置`oss.sonatype.org`账号：
+在`Maven`的`settting.xml`中配置`https://central.sonatype.com`账号：
 
 ```xml
 <servers>
     <server>
-        <id>ossrh</id>
+        <id>central</id>
         <username>__YOUR_USERNAME__</username>
         <password>__YOUR_PASSWORD__</password>
     </server>
@@ -18,15 +18,15 @@
 
 更多发布操作说明（如用于`GPG`签名的`GPG`安装与配置），参见：
 
-- OSSRH Guide  
-  https://central.sonatype.org/pages/ossrh-guide.html
-- Deploying to OSSRH with Apache Maven - Introduction  
-  https://central.sonatype.org/pages/apache-maven.html
+- Maven Central Portal Getting Started
+  https://central.sonatype.org/publish/publish-portal-guide/
+- Maven Central Portal Publishing By Using the Maven Plugin
+  https://central.sonatype.org/publish/publish-portal-maven/
 
 发布过程与发布文件的查看地址：
 
-- sonatype的发布控制台  
-  https://oss.sonatype.org/index.html
+- Maven Central Portal 的发布控制台  
+  https://central.sonatype.com
 - Maven中央库的文件查看  
   https://repo1.maven.org/maven2/com/alibaba/fastjson2/
 
diff --git a/extension/pom.xml b/extension/pom.xml
index 2e8547786..852037705 100644
--- a/extension/pom.xml
+++ b/extension/pom.xml
@@ -152,7 +152,7 @@
         <dependency>
             <groupId>com.clickhouse</groupId>
             <artifactId>clickhouse-jdbc</artifactId>
-            <version>0.8.3</version>
+            <version>0.8.6</version>
             <classifier>http</classifier>
             <scope>test</scope>
         </dependency>
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java
index a02a507e8..3b728413c 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java
@@ -37,7 +37,8 @@ import java.util.function.Supplier;
 
 public abstract class JSON
         implements JSONAware {
-    private static TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
+    private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
+    private static final int MAX_LEVEL = 2048;
     public static final String VERSION = com.alibaba.fastjson2.JSON.VERSION;
     static final Cache CACHE = new Cache();
     static final AtomicReferenceFieldUpdater<Cache, char[]> CHARS_UPDATER
@@ -45,7 +46,9 @@ public abstract class JSON
     public static TimeZone defaultTimeZone = DEFAULT_TIME_ZONE;
     public static Locale defaultLocale = Locale.getDefault();
     public static String DEFAULT_TYPE_KEY = "@type";
+    @Deprecated
     public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
     public static int DEFAULT_PARSER_FEATURE;
     public static int DEFAULT_GENERATE_FEATURE;
 
@@ -158,7 +161,7 @@ public abstract class JSON
             context.config(JSONReader.Feature.SupportAutoType);
         }
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             context.setDateFormat(defaultDateFormat);
         }
@@ -213,7 +216,7 @@ public abstract class JSON
         );
         JSONReader reader = JSONReader.of(text, context);
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             context.setDateFormat(defaultDateFormat);
         }
@@ -1304,7 +1307,7 @@ public abstract class JSON
         }
 
         if ((featuresValue & SerializerFeature.WriteDateUseDateFormat.mask) != 0) {
-            context.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
+            context.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
         }
 
         if ((featuresValue & SerializerFeature.BeanToArray.mask) != 0) {
@@ -2304,22 +2307,37 @@ public abstract class JSON
             return javaObject;
         }
 
-        Object json;
         try {
-            json = com.alibaba.fastjson2.JSON.toJSON(javaObject);
+            return adaptResult(com.alibaba.fastjson2.JSON.toJSON(javaObject));
         } catch (com.alibaba.fastjson2.JSONException e) {
             throw new JSONException(e.getMessage(), e);
         }
+    }
 
-        if (json instanceof com.alibaba.fastjson2.JSONObject) {
-            return new JSONObject((com.alibaba.fastjson2.JSONObject) json);
-        }
+    public static Object adaptResult(Object result) {
+        return adaptResult(result, 0);
+    }
 
-        if (json instanceof com.alibaba.fastjson2.JSONArray) {
-            return new JSONArray((com.alibaba.fastjson2.JSONArray) json);
+    private static Object adaptResult(Object result, int level) {
+        if (level > MAX_LEVEL) {
+            throw new JSONException("level too large : " + level);
         }
-
-        return json;
+        if (result instanceof com.alibaba.fastjson2.JSONObject) {
+            JSONObject jsonObject = new JSONObject();
+            com.alibaba.fastjson2.JSONObject object = (com.alibaba.fastjson2.JSONObject) result;
+            for (Map.Entry<String, Object> entry : object.entrySet()) {
+                jsonObject.put(entry.getKey(), adaptResult(entry.getValue(), level + 1));
+            }
+            return jsonObject;
+        } else if (result instanceof com.alibaba.fastjson2.JSONArray) {
+            JSONArray jsonArray = new JSONArray();
+            com.alibaba.fastjson2.JSONArray array = (com.alibaba.fastjson2.JSONArray) result;
+            for (int i = 0; i < array.size(); ++i) {
+                jsonArray.set(i, adaptResult(array.get(i), level + 1));
+            }
+            return jsonArray;
+        }
+        return result;
     }
 
     public static Object toJSON(Object javaObject, SerializeConfig config) {
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONArray.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONArray.java
index a9eed4ead..a2981e868 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONArray.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONArray.java
@@ -592,17 +592,7 @@ public class JSONArray
 
     @Override
     public Object get(int index) {
-        Object value = list.get(index);
-
-        if (value instanceof com.alibaba.fastjson2.JSONObject) {
-            return new JSONObject((com.alibaba.fastjson2.JSONObject) value);
-        }
-
-        if (value instanceof com.alibaba.fastjson2.JSONArray) {
-            return new JSONArray((com.alibaba.fastjson2.JSONArray) value);
-        }
-
-        return value;
+        return adaptResult(list.get(index));
     }
 
     /**
@@ -845,7 +835,7 @@ public class JSONArray
         ObjectReader objectReader = provider.getObjectReader(clazz);
         JSONReader jsonReader = JSONReader.of(json);
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             jsonReader
                     .getContext()
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONObject.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONObject.java
index bd0b7ceb9..a6260eea4 100755
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONObject.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONObject.java
@@ -127,15 +127,7 @@ public class JSONObject
             val = map.get(key.toString());
         }
 
-        if (val instanceof com.alibaba.fastjson2.JSONObject) {
-            val = new com.alibaba.fastjson.JSONObject((com.alibaba.fastjson2.JSONObject) val);
-        }
-
-        if (val instanceof com.alibaba.fastjson2.JSONArray) {
-            val = new com.alibaba.fastjson.JSONArray((com.alibaba.fastjson2.JSONArray) val);
-        }
-
-        return val;
+        return adaptResult(val);
     }
 
     public JSONObject getJSONObject(String key) {
@@ -249,7 +241,7 @@ public class JSONObject
         boolean fieldBased = jsonReader.getContext().isEnabled(JSONReader.Feature.FieldBased);
         ObjectReader objectReader = provider.getObjectReader(clazz, fieldBased);
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             jsonReader
                     .getContext()
@@ -290,7 +282,7 @@ public class JSONObject
         ObjectReader objectReader = provider.getObjectReader(type);
         JSONReader jsonReader = JSONReader.of(json);
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             jsonReader
                     .getContext()
@@ -408,7 +400,7 @@ public class JSONObject
         boolean fieldBased = jsonReader.getContext().isEnabled(JSONReader.Feature.FieldBased);
         ObjectReader objectReader = provider.getObjectReader(type, fieldBased);
 
-        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
         if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
             jsonReader
                     .getContext()
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONPath.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONPath.java
index 2908bb4bf..defecdd9e 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONPath.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONPath.java
@@ -50,23 +50,11 @@ public class JSONPath {
     }
 
     public static Object eval(String rootObject, String path) {
-        Object result = com.alibaba.fastjson2.JSONPath.eval(rootObject, path);
-        return adaptResult(result);
+        return JSON.adaptResult(com.alibaba.fastjson2.JSONPath.eval(rootObject, path));
     }
 
     public static Object eval(Object rootObject, String path) {
-        com.alibaba.fastjson2.JSONPath jsonPath = com.alibaba.fastjson2.JSONPath.of(path);
-        Object result = jsonPath.eval(rootObject);
-        return adaptResult(result);
-    }
-
-    private static Object adaptResult(Object result) {
-        if (result instanceof com.alibaba.fastjson2.JSONArray) {
-            result = new JSONArray((com.alibaba.fastjson2.JSONArray) result);
-        } else if (result instanceof com.alibaba.fastjson2.JSONObject) {
-            result = new JSONObject((com.alibaba.fastjson2.JSONObject) result);
-        }
-        return result;
+        return JSON.adaptResult(com.alibaba.fastjson2.JSONPath.of(path).eval(rootObject));
     }
 
     public static boolean set(Object rootObject, String path, Object value) {
@@ -90,7 +78,7 @@ public class JSONPath {
         JSONReader.Context context = JSON.createReadContext(JSON.DEFAULT_PARSER_FEATURE);
         JSONReader jsonReader = JSONReader.of(json, context);
         Object result = jsonPath.extract(jsonReader);
-        return adaptResult(result);
+        return JSON.adaptResult(result);
     }
 
     public static boolean remove(Object root, String path) {
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONWriter.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONWriter.java
index fb5d0728d..bd8aa96f3 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONWriter.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSONWriter.java
@@ -57,7 +57,7 @@ public class JSONWriter {
                 break;
             case WriteDateUseDateFormat:
                 if (state) {
-                    ctx.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
+                    ctx.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
                 }
                 break;
             case BeanToArray:
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
index 6781ea520..452573a68 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
@@ -196,7 +196,7 @@ public class ParserConfig {
     /**
      * fieldName,field ，先生成fieldName的快照，减少之后的findField的轮询
      *
-     * @param clazz
+     * @param clazz the specified goal class
      * @param fieldCacheMap :map&lt;fieldName ,Field&gt;
      */
     public static void parserAllFieldToCache(Class<?> clazz, Map<String, Field> fieldCacheMap) {
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/serializer/JSONSerializer.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/serializer/JSONSerializer.java
index 6afd15f4a..c299a842a 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/serializer/JSONSerializer.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/serializer/JSONSerializer.java
@@ -96,7 +96,7 @@ public class JSONSerializer {
                 ctx.config(JSONWriter.Feature.IgnoreErrorGetter);
                 break;
             case WriteDateUseDateFormat:
-                ctx.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
+                ctx.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
                 break;
             case BeanToArray:
                 ctx.config(JSONWriter.Feature.BeanToArray);
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/config/FastJsonConfig.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/config/FastJsonConfig.java
index 8e3efc9bb..667a64b3a 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/config/FastJsonConfig.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/config/FastJsonConfig.java
@@ -186,7 +186,7 @@ public class FastJsonConfig {
      * @return the dateFormat
      */
     public String getDateFormat() {
-        dateFormat = JSON.DEFFAULT_DATE_FORMAT;
+        dateFormat = JSON.DEFAULT_DATE_FORMAT;
         return dateFormat;
     }
 
@@ -194,7 +194,7 @@ public class FastJsonConfig {
      * @param dateFormat the dateFormat to set
      */
     public void setDateFormat(String dateFormat) {
-        JSON.DEFFAULT_DATE_FORMAT = dateFormat;
+        JSON.DEFAULT_DATE_FORMAT = dateFormat;
         this.dateFormat = dateFormat;
     }
 
diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java
index 089afca69..c7c852313 100644
--- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java
+++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonJsonView.java
@@ -243,7 +243,7 @@ public class FastJsonJsonView
     /**
      * Set extractValueFromSingleKeyModel.
      *
-     * @param extractValueFromSingleKeyModel
+     * @param extractValueFromSingleKeyModel extractValueFromSingleKeyModel
      */
     public void setExtractValueFromSingleKeyModel(boolean extractValueFromSingleKeyModel) {
         this.extractValueFromSingleKeyModel = extractValueFromSingleKeyModel;
diff --git a/pom.xml b/pom.xml
index 7e153a469..ce3876b60 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,9 @@
         <kotest.version>5.5.5</kotest.version>
         <jmh.version>1.37</jmh.version>
 
+        <!-- Maven Central Portal -->
+        <central.publishing.maven.version>0.7.0</central.publishing.maven.version>
+
         <!-- overridden by submodule that need skip deploy -->
         <maven.deploy.skip>false</maven.deploy.skip>
     </properties>
@@ -124,17 +127,6 @@
         </developer>
     </developers>
 
-    <distributionManagement>
-        <repository>
-            <id>ossrh</id>
-            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
-        </repository>
-        <snapshotRepository>
-            <id>ossrh</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
-        </snapshotRepository>
-    </distributionManagement>
-
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -192,7 +184,7 @@
             <dependency>
                 <groupId>com.google.code.gson</groupId>
                 <artifactId>gson</artifactId>
-                <version>2.13.0</version>
+                <version>2.13.1</version>
             </dependency>
             <dependency>
                 <groupId>com.google.guava</groupId>
@@ -280,7 +272,7 @@
             <dependency>
                 <groupId>io.projectreactor</groupId>
                 <artifactId>reactor-core</artifactId>
-                <version>3.7.4</version>
+                <version>3.7.7</version>
             </dependency>
             <dependency>
                 <groupId>io.springfox</groupId>
@@ -1049,39 +1041,12 @@
             <build>
                 <plugins>
                     <plugin>
-                        <groupId>org.sonatype.plugins</groupId>
-                        <artifactId>nexus-staging-maven-plugin</artifactId>
+                        <groupId>org.sonatype.central</groupId>
+                        <artifactId>central-publishing-maven-plugin</artifactId>
+                        <version>${central.publishing.maven.version}</version>
                         <extensions>true</extensions>
-                        <!--
-                            In multi-module builds using the deploy-at-end feature,
-                            the deployment of all components is performed in the last module based on the reactor order.
-                            If this property is set to true in the last module,
-                            all staging deployment for all modules will be skipped.
-                            so, we'll config nexus deploy after deploy phase of every module
-                            see: https://github.com/sonatype/nexus-maven-plugins/tree/master/staging/maven-plugin#configuring-the-plugin
-                        -->
-                        <executions>
-                            <execution>
-                                <id>default-deploy</id>
-                                <phase>deploy</phase>
-                                <goals>
-                                    <goal>deploy</goal>
-                                </goals>
-                            </execution>
-                        </executions>
                         <configuration>
-                            <serverId>ossrh</serverId>
-                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
-                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
-                            <!--
-                            If you are deploying to Maven Central,
-                            it is the Nexus Staging Plugin that is doing the deployment instead of the `deploy` plugin,
-                            so the configuration of the `deploy` plugin has no effect.
-                            To make the Nexus deploy plugin skip,
-                            set skipNexusStagingDeployMojo in its configuration to true.
-                            see: https://stackoverflow.com/questions/59552549/preventing-maven-modules-from-being-deployed
-                        -->
-                            <skipNexusStagingDeployMojo>${maven.deploy.skip}</skipNexusStagingDeployMojo>
+                            <publishingServerId>central</publishingServerId>
                         </configuration>
                     </plugin>
                 </plugins>


Test patch:
diff --git a/android-test/build.gradle b/android-test/build.gradle
index fa137f384..b82da5b0c 100644
--- a/android-test/build.gradle
+++ b/android-test/build.gradle
@@ -1,7 +1,7 @@
 buildscript {
     repositories {
         mavenLocal()
-        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+        maven { url "https://central.sonatype.com/repository/maven-snapshots/" }
         google()
         mavenCentral()
     }
@@ -15,7 +15,7 @@ buildscript {
 allprojects {
     repositories {
         mavenLocal()
-        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+        maven { url "https://central.sonatype.com/repository/maven-snapshots/" }
         google()
         mavenCentral()
     }
diff --git a/core/src/test/java/com/alibaba/fastjson2/JSONObjectTestBase64.java b/core/src/test/java/com/alibaba/fastjson2/JSONObjectTestBase64.java
new file mode 100644
index 000000000..16d5a22ef
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/JSONObjectTestBase64.java
@@ -0,0 +1,41 @@
+package com.alibaba.fastjson2;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+public class JSONObjectTestBase64 {
+    @Test
+    public void testBase64HavePrefix() {
+        String strBase64 = "data:image/jpeg;base64,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";
+        Map<String, String> map = new HashMap<>();
+        map.put("data", strBase64);
+        map.put("name", "LLL");
+        JSONObject jsonObj = JSONObject.from(map);
+        A a = jsonObj.toJavaObject(A.class, JSONReader.Feature.Base64StringAsByteArray);
+        assertNotEquals(null, a.getData());
+    }
+
+    @Test
+    public void testBase64NotHavePrefix() {
+        String strBase64 = "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";
+        Map<String, String> map = new HashMap<>();
+        map.put("data", strBase64);
+        map.put("name", "LLL");
+        JSONObject jsonObj = JSONObject.from(map);
+        A a = jsonObj.toJavaObject(A.class, JSONReader.Feature.Base64StringAsByteArray);
+        assertNotEquals(null, a.getData());
+    }
+
+    @Setter
+    @Getter
+    static class A {
+        private String name;
+        private byte[] data;
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/SymbolTableTest.java b/core/src/test/java/com/alibaba/fastjson2/SymbolTableTest.java
new file mode 100644
index 000000000..bbc46aead
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/SymbolTableTest.java
@@ -0,0 +1,14 @@
+package com.alibaba.fastjson2;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class SymbolTableTest {
+    @Test
+    public void test() {
+        SymbolTable symbolTable = new SymbolTable(Integer.class, Long.class);
+        assertEquals(Integer.class.getName(), symbolTable.getName(1));
+        assertEquals(Long.class.getName(), symbolTable.getName(2));
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/features/PrettyFormatTest.java b/core/src/test/java/com/alibaba/fastjson2/features/PrettyFormatTest.java
index da46d322e..13e9d773b 100644
--- a/core/src/test/java/com/alibaba/fastjson2/features/PrettyFormatTest.java
+++ b/core/src/test/java/com/alibaba/fastjson2/features/PrettyFormatTest.java
@@ -242,14 +242,14 @@ public class PrettyFormatTest {
         jsonWriter.close();
 
         assertEquals("{\n" +
-                "\t\"id\"123\n" +
+                "\t\"id\":123\n" +
                 "}", jsonWriter.toString());
 
         jsonWriter.incrementIndent();
         assertEquals(1, jsonWriter.level());
         jsonWriter.println();
         assertEquals("{\n" +
-                "\t\"id\"123\n" +
+                "\t\"id\":123\n" +
                 "}\n\t", jsonWriter.toString());
         jsonWriter.decrementIdent();
         assertEquals(0, jsonWriter.level());
@@ -266,14 +266,14 @@ public class PrettyFormatTest {
         jsonWriter.close();
 
         assertEquals("{\n" +
-                "\t\"id\"123\n" +
+                "\t\"id\":123\n" +
                 "}", jsonWriter.toString());
 
         jsonWriter.incrementIndent();
         assertEquals(1, jsonWriter.level());
         jsonWriter.println();
         assertEquals("{\n" +
-                "\t\"id\"123\n" +
+                "\t\"id\":123\n" +
                 "}\n\t", jsonWriter.toString());
         jsonWriter.decrementIdent();
         assertEquals(0, jsonWriter.level());
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues/Issue464.java b/core/src/test/java/com/alibaba/fastjson2/issues/Issue464.java
index 5ae7b0190..2bf74bc78 100644
--- a/core/src/test/java/com/alibaba/fastjson2/issues/Issue464.java
+++ b/core/src/test/java/com/alibaba/fastjson2/issues/Issue464.java
@@ -1,11 +1,13 @@
 package com.alibaba.fastjson2.issues;
 
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONReader;
 import lombok.Data;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 public class Issue464 {
@@ -46,5 +48,7 @@ public class Issue464 {
         assertNull(JSON.parseObject("\"\"", Boolean[].class));
 
         assertNull(JSON.parseObject("\"\"", Object[].class));
+
+        assertEquals(0, JSON.parseObject("\"\"", byte[].class, JSONReader.Feature.Base64StringAsByteArray).length);
     }
 }
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_2200/Issue2286.java b/core/src/test/java/com/alibaba/fastjson2/issues_2200/Issue2286.java
index b4855c45e..fd671f89b 100644
--- a/core/src/test/java/com/alibaba/fastjson2/issues_2200/Issue2286.java
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_2200/Issue2286.java
@@ -8,14 +8,14 @@ import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Type;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 public class Issue2286 {
     @Test
     public void test() {
         Bean bean = new Bean();
         bean.animal = new Cat();
-
-        String str = JSON.toJSONString(bean);
-        System.out.println(str);
+        assertEquals("{\"animal\":{\"type\":\"Cat\"}}", JSON.toJSONString(bean));
     }
 
     public static class Bean {
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2323.java b/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2323.java
index 2f04edf20..fa45e7c7f 100644
--- a/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2323.java
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2323.java
@@ -2,6 +2,7 @@ package com.alibaba.fastjson2.issues_2300;
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONLargeObjectException;
 import com.alibaba.fastjson2.JSONWriter;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -12,7 +13,7 @@ import java.util.List;
 import java.util.Map;
 
 public class Issue2323 {
-    String errMsg = "try enabling LargeObject feature instead";
+    String errMsgStart = "Maximum array size exceeded. Try enabling LargeObject feature instead. Requested size: ";
 
     @Test
     public void test() throws Exception {
@@ -32,20 +33,23 @@ public class Issue2323 {
 
         try {
             JSONWriter.ofUTF16().write(params);
-        } catch (OutOfMemoryError error) {
-            Assertions.assertEquals(errMsg, error.getMessage());
+        } catch (JSONLargeObjectException error) {
+            Assertions.assertTrue(error.getMessage().startsWith(errMsgStart),
+                    "Error message should start with: " + errMsgStart + ", but was: " + error.getMessage());
         }
 
         try {
             JSONWriter.ofUTF8().write(params);
-        } catch (OutOfMemoryError error) {
-            Assertions.assertEquals(errMsg, error.getMessage());
+        } catch (JSONLargeObjectException error) {
+            Assertions.assertTrue(error.getMessage().startsWith(errMsgStart),
+                    "Error message should start with: " + errMsgStart + ", but was: " + error.getMessage());
         }
 
         try {
             JSONWriter.ofJSONB().write(params);
-        } catch (OutOfMemoryError error) {
-            Assertions.assertEquals(errMsg, error.getMessage());
+        } catch (JSONLargeObjectException error) {
+            Assertions.assertTrue(error.getMessage().startsWith(errMsgStart),
+                    "Error message should start with: " + errMsgStart + ", but was: " + error.getMessage());
         }
     }
 }
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2375.java b/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2375.java
new file mode 100644
index 000000000..1c7110768
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_2300/Issue2375.java
@@ -0,0 +1,55 @@
+package com.alibaba.fastjson2.issues_2300;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.TypeReference;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.json.JSONException;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author 张治保
+ * @since 2024/3/29
+ */
+public class Issue2375 {
+    @Test
+    void test() throws JSONException {
+        String jsonString = "{\"name\":\"name\",\"id\":\"1\",\"extra\":\"extra\"}";
+        Tree<String> tree = JSON.parseObject(jsonString, new TypeReference<Tree<String>>() {
+        });
+        JSONAssert.assertEquals(jsonString, JSON.toJSONString(tree), true);
+
+        Tree tree2 = JSON.parseObject(jsonString, Tree.class);
+        JSONAssert.assertEquals(jsonString, JSON.toJSONString(tree2), true);
+    }
+
+    @Test
+    void test2() throws JsonProcessingException {
+        String jsonString = "{\"treeList\":[{\"name\":\"name\",\"id\":\"1\",\"extra\":\"extra\"}]}";
+        DemoVO2 vo2 = JSON.parseObject(jsonString, DemoVO2.class);
+        List<Tree<String>> list = vo2.getTreeList();
+        DemoVO2 read = new ObjectMapper().readValue(jsonString, DemoVO2.class);
+        List<Tree<String>> list1 = read.getTreeList();
+        Assertions.assertEquals(list, list1);
+    }
+
+    private static class DemoVO2
+            implements Serializable {
+        private static final long serialVersionUID = 1L;
+        List<Tree<String>> treeList;
+
+        public List<Tree<String>> getTreeList() {
+            return treeList;
+        }
+
+        public void setTreeList(List<Tree<String>> treeList) {
+            this.treeList = treeList;
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_2900/Issue2944.java b/core/src/test/java/com/alibaba/fastjson2/issues_2900/Issue2944.java
new file mode 100644
index 000000000..6735e7bfc
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_2900/Issue2944.java
@@ -0,0 +1,65 @@
+package com.alibaba.fastjson2.issues_2900;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Getter;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue2944 {
+    @Test
+    public void test() {
+        List<Employee> employees = new ArrayList<>();
+        employees.add(new Employee(0, "John"));
+        employees.add(new Employee(1, "Jane"));
+        employees.add(new Employee(2, "Bob"));
+        Department department = new Department("dev", employees);
+
+        String payload = JSON.toJSONString(department);
+        JSONObject jsonObject = JSON.parseObject(payload);
+        Department parsed = jsonObject.toJavaObject(Department.class);
+        assertEquals(payload, JSON.toJSONString(parsed));
+    }
+
+    @Getter
+    static class Department {
+        private final String name;
+        private final List<Employee> employees;
+
+        public Department(String name, List<Employee> employees) {
+            this.name = name;
+            this.employees = employees;
+        }
+
+        @Override
+        public String toString() {
+            return "Department{" +
+                    "name='" + name + '\'' +
+                    ", employees=" + employees +
+                    '}';
+        }
+    }
+
+    @Getter
+    static class Employee {
+        private final Integer id;
+        private final String name;
+
+        public Employee(int id, String name) {
+            this.id = id;
+            this.name = name;
+        }
+
+        @Override
+        public String toString() {
+            return "Employee{" +
+                    "id=" + id +
+                    ", name='" + name + '\'' +
+                    '}';
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3100/Issue3103.java b/core/src/test/java/com/alibaba/fastjson2/issues_3100/Issue3103.java
new file mode 100644
index 000000000..11e1c34ce
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3100/Issue3103.java
@@ -0,0 +1,47 @@
+package com.alibaba.fastjson2.issues_3100;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.schema.JSONSchema;
+import com.alibaba.fastjson2.schema.ValidateResult;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+public class Issue3103 {
+    @Test
+    public void test() {
+        String objectStr = "{\n" +
+                "\t\"name\": \"John Doe\",\n" +
+                "\t\"age\": 41.5\n" +
+                "}";
+        String schemaStr = "{\n" +
+                "\t\"$defs\": {\n" +
+                "\t\t\"ageLimit\": {\n" +
+                "\t\t\t\"minimum\": 18,\n" +
+                "\t\t\t\"maximum\": 60\n" +
+                "\t\t},\n" +
+                "\t\t\"ageType\": {\n" +
+                "\t\t\t\"type\": \"integer\"\n" +
+                "\t\t}\n" +
+                "\t},\n" +
+                "\t\"type\": \"object\",\n" +
+                "\t\"properties\": {\n" +
+                "\t\t\"name\": {\n" +
+                "\t\t\t\"type\": \"string\"\n" +
+                "\t\t},\n" +
+                "\t\t\"age\": {\n" +
+                "\t\t\t\"allOf\": [{\n" +
+                "\t\t\t\t\"$ref\": \"#/$defs/ageLimit\"\n" +
+                "\t\t\t}, {\n" +
+                "\t\t\t\t\"$ref\": \"#/$defs/ageType\"\n" +
+                "\t\t\t}]\n" +
+                "\t\t}\n" +
+                "\t},\n" +
+                "\t\"required\": [\"name\"]\n" +
+                "}";
+        JSONSchema schema = JSONSchema.of(JSON.parseObject(schemaStr));
+        ValidateResult result = schema.validate(JSONObject.parseObject(objectStr));
+        assertFalse(result.isSuccess());
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3200/Issue3200.java b/core/src/test/java/com/alibaba/fastjson2/issues_3200/Issue3200.java
new file mode 100644
index 000000000..653ccb612
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3200/Issue3200.java
@@ -0,0 +1,33 @@
+package com.alibaba.fastjson2.issues_3200;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONWriter;
+import com.alibaba.fastjson2.annotation.JSONField;
+import lombok.Getter;
+import lombok.Setter;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3200 {
+    @Test
+    public void testArray() {
+        SecondMenuGroupUI secondMenuGroupUI = new SecondMenuGroupUI();
+        secondMenuGroupUI.setGroupId("group1");
+        secondMenuGroupUI.setGroupName("分组");
+        assertEquals("{\"groupId\":\"group1\",\"groupName\":\"分组\",\"secondList\":[]}", JSON.toJSONString(secondMenuGroupUI));
+    }
+
+    @Getter
+    @Setter
+    public static class SecondMenuGroupUI {
+        @JSONField(ordinal = 2)
+        private String groupName;
+        @JSONField(ordinal = 1)
+        private String groupId;
+        @JSONField(ordinal = 3, serializeFeatures = JSONWriter.Feature.WriteNullListAsEmpty)
+        private List<String> secondList;
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3331.java b/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3331.java
new file mode 100644
index 000000000..95320281f
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3331.java
@@ -0,0 +1,18 @@
+package com.alibaba.fastjson2.issues_3300;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3331 {
+    @Test
+    public void test() {
+        String json = "[{\"priority_flag\":9,\"service_type\":\"bbb\",\"destination_addr\":\"bbb\"}]";
+        Object object1 = com.alibaba.fastjson.JSON.parse(json);
+        Object object2 = com.alibaba.fastjson2.JSON.parse(json);
+        String path = "$.service_type";
+        assertEquals(com.alibaba.fastjson.JSONPath.contains(object1, path), com.alibaba.fastjson2.JSONPath.contains(object2, path));
+        path = "$[0].service_type";
+        assertEquals(com.alibaba.fastjson.JSONPath.contains(object1, path), com.alibaba.fastjson2.JSONPath.contains(object2, path));
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3375.java b/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3375.java
new file mode 100644
index 000000000..15df2746c
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3300/Issue3375.java
@@ -0,0 +1,31 @@
+package com.alibaba.fastjson2.issues_3300;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONPath;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3375 {
+    @Test
+    public void test() {
+        String json = "{\n" +
+                "\t\"name\": \"\",\n" +
+                "\t\"value\": [{\n" +
+                "\t\t\"id\": \"101\",\n" +
+                "\t\t\"additionalProperty\": [{\n" +
+                "\t\t\t\t\"token\": \"token1\"\n" +
+                "\t\t\t},\n" +
+                "\t\t\t{\n" +
+                "\t\t\t\t\"token\": \"token2\"\n" +
+                "\t\t\t}\n" +
+                "\t\t]\n" +
+                "\t}]\n" +
+                "}";
+        Object object = JSON.parse(json);
+        String path = "$.value.additionalProperty[*].token";
+        JSONPath.set(object, path, "******");
+        Object extract = JSONPath.extract(JSON.toJSONString(object), path);
+        assertEquals("[\"******\",\"******\"]", JSON.toJSONString(extract));
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3537.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3537.java
new file mode 100644
index 000000000..3eead13cb
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3537.java
@@ -0,0 +1,39 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSON;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class Issue3537 {
+    @Test
+    public void test() {
+        String json = "{\"value\":\"\"}";
+        SimpleTestValue s = JSON.parseObject(json, SimpleTestValue.class);
+        assertEquals("", s.getValue());
+        json = "{\"value\":null}";
+        s = JSON.parseObject(json, SimpleTestValue.class);
+        assertNull(s.getValue());
+    }
+
+    public static class SimpleTestValue {
+        private Object value;
+
+        // 标准 getter/setter
+        public Object getValue() {
+            return value;
+        }
+        public void setValue(Object value) {
+            this.value = value;
+        }
+
+        // 自定义 getter 会导致问题
+        public List<String> getRelates() {
+            return Collections.emptyList();
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3540.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3540.java
new file mode 100644
index 000000000..916153644
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3540.java
@@ -0,0 +1,73 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.annotation.JSONType;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3540 {
+    @Test
+    public void exceptUseSeeAlsoDefault() {
+        final String json = "                {\n" +
+                "                    \"name\": \"tom\",\n" +
+                "                    \"age\": 18\n" +
+                "                }";
+        IAnimal animal = JSON.parseObject(json, IAnimal.class);
+        assertEquals(Dog.class, animal.getClass());
+    }
+
+    @Test
+    public void exceptUseSeeAlsoDefault2() {
+        final String json = "                {\n" +
+                "                    \"@type\": \"\",\n" +
+                "                    \"name\": \"tom\",\n" +
+                "                    \"age\": 18\n" +
+                "                }";
+        IAnimal animal = JSON.parseObject(json, IAnimal.class);
+        assertEquals(Dog.class, animal.getClass());
+    }
+
+    @Test
+    public void useTypeForSeeAlso() {
+        final String json = "                {\n" +
+                "                    \"@type\": \"Dog\",\n" +
+                "                    \"name\": \"tom\",\n" +
+                "                    \"age\": 18\n" +
+                "                }";
+        IAnimal animal = JSON.parseObject(json, IAnimal.class);
+        assertEquals(Dog.class, animal.getClass());
+    }
+
+    @JSONType(seeAlso = Dog.class, seeAlsoDefault = Dog.class)
+    public interface IAnimal {
+        String getName();
+
+        int getAge();
+    }
+
+    @JSONType(typeName = "Dog")
+    public static class Dog
+            implements IAnimal {
+        private String name;
+        private int age;
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public void setAge(int age) {
+            this.age = age;
+        }
+
+        @Override
+        public String getName() {
+            return null;
+        }
+
+        @Override
+        public int getAge() {
+            return 0;
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3546.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3546.java
new file mode 100644
index 000000000..a657d9a1d
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3546.java
@@ -0,0 +1,47 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONWriter;
+import lombok.Getter;
+import lombok.Setter;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3546 {
+    @Test
+    public void test() {
+        TextMessage textMsg = new TextMessage();
+
+        // 第一次设置父类实例
+        textMsg.setData(new Message());
+        assertEquals("{\"data\":{\"channel\":null}}", JSON.toJSONString(textMsg, JSONWriter.Feature.WriteNulls));
+
+        // 第二次设置子类实例
+        AssignMessage am = new AssignMessage();
+        am.setAssignee("assignee");
+        textMsg.setData(am);
+
+        assertEquals("{\"data\":{\"assignee\":\"assignee\",\"channel\":null}}", JSON.toJSONString(textMsg, JSONWriter.Feature.WriteNulls));
+    }
+
+    @Getter
+    @Setter
+    class Message {
+        private String channel;
+        // getter/setter...
+    }
+
+    @Getter
+    @Setter
+    class AssignMessage
+            extends Message {
+        private String assignee;
+    }
+
+    @Getter
+    @Setter
+    class TextMessage {
+        private Object data;
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3559.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3559.java
new file mode 100644
index 000000000..43c158f69
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3559.java
@@ -0,0 +1,21 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSON;
+import org.junit.jupiter.api.Test;
+import org.springframework.core.io.FileSystemResource;
+
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3559 {
+    @Test
+    public void test() throws IOException {
+        FileSystemResource resource = new FileSystemResource(this.getClass().getClassLoader().getResource("issues/issue3559.json").getPath());
+        long length = resource.contentLength();
+        long modified = resource.lastModified();
+        JSON.toJSONString(resource);
+        assertEquals(length, resource.contentLength());
+        assertEquals(modified, resource.lastModified());
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3569.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3569.java
new file mode 100644
index 000000000..9bee112d5
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3569.java
@@ -0,0 +1,33 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class Issue3569 {
+    @Test
+    public void test() {
+        TestClass<String> testClass1 = new TestClass<>("hello");
+        JSONObject jsonObject = JSONObject.from(testClass1);
+        assertEquals(jsonObject.toString(), "{\"generic\":\"hello\"}");
+
+        TestClass<TestData> testClass2 = new TestClass<>(new TestData("hello"));
+        jsonObject = JSONObject.from(testClass2);
+        assertEquals(jsonObject.toString(), "{\"generic\":{\"testData\":\"hello\"}}");
+    }
+
+    @Data
+    @AllArgsConstructor
+    public static class TestClass<T> {
+        private T generic;
+    }
+
+    @Data
+    @AllArgsConstructor
+    public static class TestData {
+        private String testData;
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3577.java b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3577.java
new file mode 100644
index 000000000..2264dc737
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3500/Issue3577.java
@@ -0,0 +1,92 @@
+package com.alibaba.fastjson2.issues_3500;
+
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.junit.jupiter.api.Test;
+
+import java.io.Serializable;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class Issue3577 {
+    @Test
+    public void test() {
+        String json = "{            \n" +
+                "            \"certifiedMaterials\": {\n" +
+                "              \"show\": false,\n" +
+                "              \"materials\": []\n" +
+                "            }\n" +
+                "          }";
+
+        ColorBrandsProduct dto = JSON.parseObject(json, ColorBrandsProduct.class);
+        assertNotNull(dto);
+        assertNull(dto.getCertifiedMaterials().getContainsAtLeastTitle());
+    }
+
+    @JsonPropertyOrder(ColorBrandsProduct.JSON_PROPERTY_CERTIFIED_MATERIALS)
+    @JsonTypeName("Color")
+    public static class ColorBrandsProduct
+            implements Serializable {
+        private static final long serialVersionUID = 1L;
+        public static final String JSON_PROPERTY_CERTIFIED_MATERIALS = "certifiedMaterials";
+        private CertifiedMaterialsBrandsProduct certifiedMaterials;
+        public ColorBrandsProduct certifiedMaterials(CertifiedMaterialsBrandsProduct certifiedMaterials) {
+            this.certifiedMaterials = certifiedMaterials;
+            return this;
+        }
+
+        /**
+         * Get certifiedMaterials
+         *
+         * @return certifiedMaterials
+         **/
+        @JsonProperty(JSON_PROPERTY_CERTIFIED_MATERIALS)
+        @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+        public CertifiedMaterialsBrandsProduct getCertifiedMaterials() {
+            return certifiedMaterials;
+        }
+
+        @JsonProperty(JSON_PROPERTY_CERTIFIED_MATERIALS)
+        @JsonInclude(value = JsonInclude.Include.ALWAYS)
+        public void setCertifiedMaterials(CertifiedMaterialsBrandsProduct certifiedMaterials) {
+            this.certifiedMaterials = certifiedMaterials;
+        }
+    }
+
+    @JsonPropertyOrder(CertifiedMaterialsBrandsProduct.JSON_PROPERTY_CONTAINS_AT_LEAST_TITLE)
+    @JsonTypeName("CertifiedMaterials")
+    public static class CertifiedMaterialsBrandsProduct
+            implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        public static final String JSON_PROPERTY_CONTAINS_AT_LEAST_TITLE = "containsAtLeastTitle";
+        private String containsAtLeastTitle;
+
+        public CertifiedMaterialsBrandsProduct containsAtLeastTitle(String containsAtLeastTitle) {
+            this.containsAtLeastTitle = containsAtLeastTitle;
+            return this;
+        }
+
+        /**
+         * Title that says \&quot;contains at least\&quot;, translated to the given store language.
+         *
+         * @return containsAtLeastTitle
+         **/
+        @JsonProperty(JSON_PROPERTY_CONTAINS_AT_LEAST_TITLE)
+        // @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+        public String getContainsAtLeastTitle() {
+            return containsAtLeastTitle;
+        }
+
+        @JsonProperty(JSON_PROPERTY_CONTAINS_AT_LEAST_TITLE)
+        @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+        public void setContainsAtLeastTitle(String containsAtLeastTitle) {
+            this.containsAtLeastTitle = containsAtLeastTitle;
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/FastJson2Reader.java b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/FastJson2Reader.java
new file mode 100644
index 000000000..6049ed341
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/FastJson2Reader.java
@@ -0,0 +1,30 @@
+package com.alibaba.fastjson2.issues_3600.issue3601;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.modules.ObjectReaderModule;
+import com.alibaba.fastjson2.reader.ObjectReader;
+import com.alibaba.fastjson2.reader.ObjectReaderImplList;
+import lombok.var;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+public class FastJson2Reader {
+    public static class JsonReaderModule
+            implements ObjectReaderModule {
+        @Override
+        public ObjectReader getObjectReader(Type type) {
+            if (type instanceof ParameterizedType) {
+                var ptype = (ParameterizedType) type;
+                if (ptype.getRawType() == MyArrayList.class) {
+                    return ObjectReaderImplList.of(type, null, 0);
+                }
+            }
+            return ObjectReaderModule.super.getObjectReader(type);
+        }
+    }
+
+    public static void init() {
+        JSON.register(new JsonReaderModule());
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/Issue3601.java b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/Issue3601.java
new file mode 100644
index 000000000..200c81afa
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/Issue3601.java
@@ -0,0 +1,45 @@
+package com.alibaba.fastjson2.issues_3600.issue3601;
+
+import com.alibaba.fastjson2.JSON;
+import lombok.var;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class Issue3601 {
+    @Test
+    public void test() {
+        FastJson2Reader.init();
+
+        var game = new Game();
+        game.players.addAll(Arrays.asList(new Player(1, 100), new Player(2, 200)));
+
+        var gameJson = JSON.toJSONString(game);
+        var deserializedGame1 = JSON.parseObject(gameJson, Game.class);
+        assertTrue(deserializedGame1.players.get(0).getClass() == Player.class);
+    }
+
+    public static class Player {
+        public int level;
+        public int exp;
+        public Player() {
+        }
+        public Player(int level, int exp) {
+            this.level = level;
+            this.exp = exp;
+        }
+    }
+
+    public static class Game {
+//        private ArrayList<Player> players = new ArrayList<>();
+        private MyArrayList<Player> players = new MyArrayList<>();
+        public MyArrayList<Player> getPlayers() {
+            return players;
+        }
+        public void setPlayers(MyArrayList<Player> players) {
+            this.players = players;
+        }
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/MyArrayList.java b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/MyArrayList.java
new file mode 100644
index 000000000..238c1116a
--- /dev/null
+++ b/core/src/test/java/com/alibaba/fastjson2/issues_3600/issue3601/MyArrayList.java
@@ -0,0 +1,181 @@
+package com.alibaba.fastjson2.issues_3600.issue3601;
+
+import lombok.var;
+
+import java.util.*;
+
+public class MyArrayList<T>
+        implements List<T> {
+    private transient ArrayList<T> impl = new ArrayList<>();
+
+    public MyArrayList() {
+    }
+
+    public MyArrayList(Collection<T> coll) {
+        this.addAll(coll);
+    }
+
+    public MyArrayList(T... coll) {
+        for (T v : coll) {
+            this.add(v);
+        }
+    }
+
+    @Override
+    public int size() {
+        return impl.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return impl.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return impl.contains(o);
+    }
+
+    @Override
+    public Iterator<T> iterator() {
+        return impl.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return impl.toArray();
+    }
+
+    @Override
+    public <V> V[] toArray(V[] a) {
+        return impl.toArray(a);
+    }
+
+    @Override
+    public boolean add(T v) {
+        boolean r = impl.add(v);
+        return r;
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        int index = impl.indexOf(o);
+        var r = index >= 0;
+        return r;
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return impl.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends T> c) {
+        impl.ensureCapacity(impl.size() + c.size());
+        for (var v : c) {
+            this.add(v);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends T> c) {
+        impl.ensureCapacity(impl.size() + c.size());
+        for (var v : c) {
+            this.add(index++, v);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        for (var v : c) {
+            this.remove(v);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        throw new UnsupportedOperationException("retainAll");
+    }
+
+    @Override
+    public void clear() {
+        if (isEmpty()) {
+            return;
+        }
+        impl.clear();
+    }
+
+    @Override
+    public T get(int index) {
+        return impl.get(index);
+    }
+
+    @Override
+    public T set(int index, T element) {
+        var r = impl.set(index, element);
+        return r;
+    }
+
+    @Override
+    public void add(int index, T element) {
+        impl.add(index, element);
+    }
+
+    @Override
+    public T remove(int index) {
+        T prev = impl.remove(index);
+        return prev;
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return impl.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return impl.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<T> listIterator() {
+        return impl.listIterator();
+    }
+
+    @Override
+    public ListIterator<T> listIterator(int index) {
+        return impl.listIterator(index);
+    }
+
+    @Override
+    public List<T> subList(int fromIndex, int toIndex) {
+        return Collections.unmodifiableList(impl.subList(fromIndex, toIndex));
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        MyArrayList<?> dbList = (MyArrayList<?>) o;
+        return impl.equals(dbList.impl);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(impl);
+    }
+
+    @Override
+    public String toString() {
+        return "MyArrayList{" +
+                "impl=" + impl +
+                '}';
+    }
+}
diff --git a/core/src/test/java/com/alibaba/fastjson2/util/BeanUtilsTest.java b/core/src/test/java/com/alibaba/fastjson2/util/BeanUtilsTest.java
index 19b7c7324..e5d602cde 100644
--- a/core/src/test/java/com/alibaba/fastjson2/util/BeanUtilsTest.java
+++ b/core/src/test/java/com/alibaba/fastjson2/util/BeanUtilsTest.java
@@ -307,7 +307,8 @@ public class BeanUtilsTest {
                 "java.util.concurrent.locks.Lock",
                 "java.util.concurrent.locks.ReentrantLock",
                 "java.security.ProtectionDomain",
-                "java.lang.ref.ReferenceQueue"
+                "java.lang.ref.ReferenceQueue",
+                "java.io.OutputStream"
         };
 
         long[] hashCodes = new long[names.length];
diff --git a/core/src/test/resources/issues/issue3559.json b/core/src/test/resources/issues/issue3559.json
new file mode 100644
index 000000000..2c63c0851
--- /dev/null
+++ b/core/src/test/resources/issues/issue3559.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/example-solon-test/pom.xml b/example-solon-test/pom.xml
index 58363d7d5..72a855c49 100644
--- a/example-solon-test/pom.xml
+++ b/example-solon-test/pom.xml
@@ -30,7 +30,7 @@
 
         <repository>
             <id>snapshots</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
         </repository>
     </repositories>
 
diff --git a/example-spring-test/pom.xml b/example-spring-test/pom.xml
index 49be7d2b9..b8e6e383d 100644
--- a/example-spring-test/pom.xml
+++ b/example-spring-test/pom.xml
@@ -38,7 +38,7 @@
         </repository>
         <repository>
             <id>snapshots</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+            <url>https://central.sonatype.com/repository/maven-snapshots/</url>
         </repository>
     </repositories>
 
diff --git a/extension-spring5/src/test/java/com/alibaba/fastjson2/spring/issues/issue3539/Issue3539.java b/extension-spring5/src/test/java/com/alibaba/fastjson2/spring/issues/issue3539/Issue3539.java
new file mode 100644
index 000000000..d562d9054
--- /dev/null
+++ b/extension-spring5/src/test/java/com/alibaba/fastjson2/spring/issues/issue3539/Issue3539.java
@@ -0,0 +1,95 @@
+package com.alibaba.fastjson2.spring.issues.issue3539;
+
+import com.alibaba.fastjson2.support.config.FastJsonConfig;
+import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;
+import lombok.Data;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.filter.CharacterEncodingFilter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@ExtendWith(SpringExtension.class)
+@WebAppConfiguration
+@ContextConfiguration
+public class Issue3539 {
+    @Autowired
+    private WebApplicationContext wac;
+
+    private MockMvc mockMvc;
+
+    @BeforeEach
+    public void setup() {
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
+                .addFilter(new CharacterEncodingFilter("UTF-8", true))
+                .build();
+    }
+
+    @Test
+    public void test() throws Exception {
+        String requestJson = "{\"date\":\"\",\"abc\":false,\"def\":\"def\"}";
+        mockMvc.perform(
+                (post("/issue3539").characterEncoding("UTF-8")
+                        .contentType(MediaType.APPLICATION_JSON_VALUE)
+                        .content(requestJson)
+                )).andExpect(status().isOk());
+    }
+
+    @RestController
+    public static class TestController {
+        @PostMapping(value = "/issue3539", produces = "application/json")
+        public void issue3539(@RequestBody TestData testData) {
+            assertEquals(testData.abc, false);
+        }
+    }
+
+    @ComponentScan(basePackages = "com.alibaba.fastjson2.spring.issues.issue3539")
+    @Configuration
+    @Order(Ordered.LOWEST_PRECEDENCE + 1)
+    @EnableWebMvc
+    public static class WebMvcConfig
+            implements WebMvcConfigurer {
+        @Override
+        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+            FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
+            FastJsonConfig fastJsonConfig = new FastJsonConfig();
+            fastConverter.setFastJsonConfig(fastJsonConfig);
+            fastConverter.setDefaultCharset(StandardCharsets.UTF_8);
+            converters.add(0, fastConverter);
+        }
+    }
+
+    @Data
+    public class TestData {
+        private LocalDateTime date;
+
+        private Boolean abc;
+
+        private String def;
+    }
+}
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONTest.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONTest.java
index 8f3a72d79..3530a46d0 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONTest.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONTest.java
@@ -335,7 +335,7 @@ public class JSONTest {
                                 Collections.emptyList(),
                                 SerializeConfig.global,
                                 new SerializeFilter[0],
-                                JSON.DEFFAULT_DATE_FORMAT,
+                                JSON.DEFAULT_DATE_FORMAT,
                                 JSON.DEFAULT_GENERATE_FEATURE,
                                 SerializerFeature.BrowserSecure)
                 )
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONWriterTest.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONWriterTest.java
index ad6359439..275879577 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONWriterTest.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/JSONWriterTest.java
@@ -55,6 +55,6 @@ public class JSONWriterTest {
         assertTrue(context.isEnabled(com.alibaba.fastjson2.JSONWriter.Feature.BeanToArray));
 
         writer.config(SerializerFeature.WriteDateUseDateFormat, true);
-        assertEquals(JSON.DEFFAULT_DATE_FORMAT, context.getDateFormat());
+        assertEquals(JSON.DEFAULT_DATE_FORMAT, context.getDateFormat());
     }
 }
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/TimestampTest.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/TimestampTest.java
index 50877645b..24ccd35d0 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/TimestampTest.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/TimestampTest.java
@@ -22,7 +22,7 @@ public class TimestampTest {
     public void test_0() throws Exception {
         long millis = 1668216743000L;
 
-        SimpleDateFormat format = new SimpleDateFormat(JSON.DEFFAULT_DATE_FORMAT, JSON.defaultLocale);
+        SimpleDateFormat format = new SimpleDateFormat(JSON.DEFAULT_DATE_FORMAT, JSON.defaultLocale);
         format.setTimeZone(JSON.defaultTimeZone);
         String text = "\"" + format.format(new Date(millis)) + "\"";
         System.out.println(text);
@@ -34,14 +34,14 @@ public class TimestampTest {
                 "\"2022-11-12 00:00:00\"",
                 JSON.toJSONStringWithDateFormat(
                         JSON.parseObject(text, java.sql.Date.class),
-                        JSON.DEFFAULT_DATE_FORMAT
+                        JSON.DEFAULT_DATE_FORMAT
                 )
         );
         assertEquals(
                 "\"2022-11-12 09:32:23\"",
                 JSON.toJSONStringWithDateFormat(
                         JSON.parseObject(text, java.util.Date.class),
-                        JSON.DEFFAULT_DATE_FORMAT
+                        JSON.DEFAULT_DATE_FORMAT
                 )
         );
     }
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_1300/Issue_for_zuojian.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_1300/Issue_for_zuojian.java
index b7cdbdaec..ef8b35eb5 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_1300/Issue_for_zuojian.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_1300/Issue_for_zuojian.java
@@ -9,21 +9,21 @@ import java.util.Date;
 public class Issue_for_zuojian {
     @Test
     public void test_for_issue() throws Exception {
-        JSON.DEFFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
+        JSON.DEFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
         String json = "{\"value\":\"20180131022733000-0800\"}";
         JSON.parseObject(json, Model.class);
-        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+        JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
     }
 
     @Test
     public void test_for_issue_1() throws Exception {
-        JSON.DEFFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
+        JSON.DEFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
 
         String json = "{\"value\":\"20180131022733000-0800\"}";
         JSONObject object = JSON.parseObject(json);
         object.getObject("value", Date.class);
 
-        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+        JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
     }
 
     public static class Model {
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_2100/Issue2156.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_2100/Issue2156.java
index 9efdd757d..a7dc5a860 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_2100/Issue2156.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_2100/Issue2156.java
@@ -43,7 +43,7 @@ public class Issue2156 {
     @Test
     public void test_for_issue_time() throws Exception {
         java.sql.Time date = java.sql.Time.valueOf("12:13:14");
-        String str = JSON.toJSONStringWithDateFormat(date, JSON.DEFFAULT_DATE_FORMAT);
+        String str = JSON.toJSONStringWithDateFormat(date, JSON.DEFAULT_DATE_FORMAT);
         assertEquals("\"12:13:14\"", str);
     }
 }
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3100/Issue3185.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3100/Issue3185.java
new file mode 100644
index 000000000..9d2f1f970
--- /dev/null
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3100/Issue3185.java
@@ -0,0 +1,32 @@
+package com.alibaba.fastjson.issue_3100;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class Issue3185 {
+    @Test
+    public void test_jsonpath_array() {
+        List list1 = new LinkedList();
+        Map map1 = new HashMap();
+        Map map2 = new HashMap();
+        map2.put("id", "123");
+        map2.put("name", "张三");
+        list1.add(map2);
+        map1.put("list1", list1);
+
+        JSONObject jsonObject = (JSONObject) JSON.toJSON(map1);
+        JSONArray jsonArray = (JSONArray) jsonObject.get("list1");
+        for (Object subJsonObject : jsonArray) {
+            assertTrue(subJsonObject instanceof JSONObject);
+        }
+    }
+}
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3300/Issue3361.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3300/Issue3361.java
index 3219408fd..65e1f07d5 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3300/Issue3361.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/issue_3300/Issue3361.java
@@ -22,7 +22,7 @@ public class Issue3361 {
 
     @BeforeEach
     public void setUp() throws Exception {
-        ORIGIN_JSON_DEFAULT_DATE_FORMAT = JSON.DEFFAULT_DATE_FORMAT;
+        ORIGIN_JSON_DEFAULT_DATE_FORMAT = JSON.DEFAULT_DATE_FORMAT;
     }
 
     @Test
@@ -34,8 +34,8 @@ public class Issue3361 {
         FastJsonConfig config = new FastJsonConfig();
         config.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
         config.setWriteContentLength(false);
-        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS";
-        config.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
+        JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS";
+        config.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
         String string = JSON.toJSONString(model,
                 config.getSerializeConfig(),
                 config.getSerializeFilters(),
@@ -54,7 +54,7 @@ public class Issue3361 {
 
     @AfterEach
     public void tearDown() throws Exception {
-        JSON.DEFFAULT_DATE_FORMAT = ORIGIN_JSON_DEFAULT_DATE_FORMAT;
+        JSON.DEFAULT_DATE_FORMAT = ORIGIN_JSON_DEFAULT_DATE_FORMAT;
     }
 
     @Getter
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/serializer/JSONSerializerTest.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/serializer/JSONSerializerTest.java
index 220c3b76c..3e0165a7a 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/serializer/JSONSerializerTest.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/serializer/JSONSerializerTest.java
@@ -51,7 +51,7 @@ public class JSONSerializerTest {
         assertTrue(context.isEnabled(com.alibaba.fastjson2.JSONWriter.Feature.BeanToArray));
 
         writer.config(SerializerFeature.WriteDateUseDateFormat, true);
-        assertEquals(JSON.DEFFAULT_DATE_FORMAT, context.getDateFormat());
+        assertEquals(JSON.DEFAULT_DATE_FORMAT, context.getDateFormat());
     }
 
     @Test
diff --git a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2529.java b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2529.java
index ff7077458..173895559 100644
--- a/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2529.java
+++ b/fastjson1-compatible/src/test/java/com/alibaba/fastjson/v2issues/Issue2529.java
@@ -10,15 +10,15 @@ import java.util.Date;
 public class Issue2529 {
     @Test
     public void test() {
-        final String format = JSON.DEFFAULT_DATE_FORMAT;
+        final String format = JSON.DEFAULT_DATE_FORMAT;
         try {
-            JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
+            JSONObject.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
             ResultVo rv = ResultVo.sucessReturn("测试Date转换");
             String str = JSONObject.toJSONString(rv);
             ResultVo rvnew = JSON.parseObject(str, ResultVo.class);
             System.out.println(JSONObject.toJSONString(rvnew));
         } finally {
-            JSON.DEFFAULT_DATE_FORMAT = format;
+            JSON.DEFAULT_DATE_FORMAT = format;
         }
     }