Repository: alibaba/fastjson2
Pull request #3567 (2025-05-19 19:48:33)

Bump com.clickhouse:clickhouse-jdbc from 0.8.3 to 0.8.6
Bumps [com.clickhouse:clickhouse-jdbc](https://github.com/ClickHouse/clickhouse-java) from 0.8.3 to 0.8.6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/ClickHouse/clickhouse-java/releases">com.clickhouse:clickhouse-jdbc's releases</a>.</em></p>
<blockquote>
<h2>Release v0.8.6</h2>
<h2>Improvements</h2>
<ul>
<li>[jdbc-v2] Now using Antlr4 to parse SQL statements to get meta information about it.
Invalid SQL still possible to execute if logic able to get all required information. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2351">ClickHouse/clickhouse-java#2351</a>)</li>
<li>[jdbc-v2] Now possible to use <code>RowBinaryWriter</code> if enabled by property <code>com.clickhouse.jdbc.internal.DriverProperties.BETA_ROW_BINARY_WRITER</code>.
This works well for batches. Single statements may get no benefits. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2316">ClickHouse/clickhouse-java#2316</a>)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>[jdbc-v2] Fixed parsing prepared statement arguments. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2348">ClickHouse/clickhouse-java#2348</a>)</li>
<li>[jdbc-v2] Fixed parsing role name when it contains <code>-</code>. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2325">ClickHouse/clickhouse-java#2325</a>)</li>
<li>[jdbc-v2] Fixed failure when <code>INSERT</code> doesn't contain <code>VALUES</code>. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2283">ClickHouse/clickhouse-java#2283</a>)</li>
<li>[jdbc-v2] Fixed parsing <code>INSERT</code> statement when <code>VALUES</code> is in lower case. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2354">ClickHouse/clickhouse-java#2354</a>)</li>
<li>[client-v2] Fixed NPE when async operation is request while client was built without an executor.
In this case default JVM executor will be used. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2355">ClickHouse/clickhouse-java#2355</a>)</li>
<li>[client-v2, jdbc-v2] Fixed conversion of IP addresses. When IPv4 stored as IPv6 it is correctly converted
to <code>Inet6Address</code>. Similar problem fixed for JDBC. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2342">ClickHouse/clickhouse-java#2342</a>)</li>
<li>[jdbc-v2] Fixed changing DB schema (DB name) on connection when <code>USE</code> statement executed. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2137">ClickHouse/clickhouse-java#2137</a>)</li>
<li>[client-v2] Fixed serializing POJO with primitive <code>boolean</code> fields. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2248">ClickHouse/clickhouse-java#2248</a>)</li>
</ul>
<h2>Release v0.8.5</h2>
<h2>Improvements</h2>
<ul>
<li>[jdbc-v2] Added debug output for final SQL. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2249">ClickHouse/clickhouse-java#2249</a>)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>[client-v2] Fixed creating TableSchema for materialized views. It resolves issues with POJO serde. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2118">ClickHouse/clickhouse-java#2118</a>,
<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2025">ClickHouse/clickhouse-java#2025</a>)</li>
<li>[client-v2, jdbc-v2] Fixed handling <code>Nullable</code> inside <code>SimpleAggregateFunction</code> columns. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2110">ClickHouse/clickhouse-java#2110</a>)</li>
<li>[jdbc-v2] Fixed problem with server info request. It is fetched now when timezone of the server is set. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2191">ClickHouse/clickhouse-java#2191</a>)</li>
<li>[jdbc-v2] Fixed null response for <code>getIndexInfo()</code>. Empty Result Set is returned. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2286">ClickHouse/clickhouse-java#2286</a>)</li>
<li>[jdbc-v2] Fixed wrong <code>false</code> response in <code>DataBaseMetadata.supportsBatchUpdates()</code>. Returns <code>true</code> now. Please note that
no update is supported for result sets.</li>
<li>[jdbc-v2] Fixed handling UUID data type in PreparedStatement. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2327">ClickHouse/clickhouse-java#2327</a>)</li>
<li>[jdbc-v2] Fixed unsigned integer type matching. <code>UInt8</code>, <code>UInt16</code>, <code>UInt32</code>, <code>UInt64</code>, <code>UInt128</code>, <code>UInt256</code> are presented as
<code>short</code>, <code>int</code>, <code>long</code>, <code>BigInteger</code>, <code>BigInteger</code>, <code>BigInteger</code> correspondingly. SQLType for them is <code>OTHER</code> because
JDBC (as well as Java) doesn't provide good mapping for unsigned integers. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2333">ClickHouse/clickhouse-java#2333</a>)</li>
<li>[jdbc-v2] Disallowed to call method from <code>Statement</code> interface on <code>PreparedStatement</code> instance according to the JDBC spec. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2339">ClickHouse/clickhouse-java#2339</a>)</li>
</ul>
<h2>Release v0.8.4</h2>
<h2>Examples</h2>
<ul>
<li>[jdbc-v2] - JPA example added. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2301">ClickHouse/clickhouse-java#2301</a>)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>[jdbc-v2] Added implementation of <code>ResultSetMetaData.getColumnClassName()</code> to return information
about class name of the value stored in a result. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2112">ClickHouse/clickhouse-java#2112</a>)</li>
<li>[client-v2] Fixed NPE when <code>Client.queryAll</code> used with <code>INSERT</code> statement because internally <code>columns</code> variable
was accessed and was null. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2150">ClickHouse/clickhouse-java#2150</a>)</li>
<li>[jdbc-v2] Fixed NPE when <code>ssl=true</code> was passed via an connection URL. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2206">ClickHouse/clickhouse-java#2206</a>)</li>
<li>[jdbc-v2] Fixed sending correct driver version. Problem occurs because context classloader had no access to</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/ClickHouse/clickhouse-java/blob/main/CHANGELOG.md">com.clickhouse:clickhouse-jdbc's changelog</a>.</em></p>
<blockquote>
<h2>0.8.6</h2>
<h3>Improvements</h3>
<ul>
<li>[jdbc-v2] Now using Antlr4 to parse SQL statements to get meta information about it.
Invalid SQL still possible to execute if logic able to get all required information. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2351">ClickHouse/clickhouse-java#2351</a>)</li>
<li>[jdbc-v2] Now possible to use <code>RowBinaryWriter</code> if enabled by property <code>com.clickhouse.jdbc.internal.DriverProperties.BETA_ROW_BINARY_WRITER</code>.
This works well for batches. Single statements may get no benefits. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2316">ClickHouse/clickhouse-java#2316</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>[jdbc-v2] Fixed parsing prepared statement arguments. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2348">ClickHouse/clickhouse-java#2348</a>)</li>
<li>[jdbc-v2] Fixed parsing role name when it contains <code>-</code>. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2325">ClickHouse/clickhouse-java#2325</a>)</li>
<li>[jdbc-v2] Fixed failure when <code>INSERT</code> doesn't contain <code>VALUES</code>. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2283">ClickHouse/clickhouse-java#2283</a>)</li>
<li>[jdbc-v2] Fixed parsing <code>INSERT</code> statement when <code>VALUES</code> is in lower case. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2354">ClickHouse/clickhouse-java#2354</a>)</li>
<li>[client-v2] Fixed NPE when async operation is request while client was built without an executor.
In this case default JVM executor will be used. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2355">ClickHouse/clickhouse-java#2355</a>)</li>
<li>[client-v2, jdbc-v2] Fixed conversion of IP addresses. When IPv4 stored as IPv6 it is correctly converted
to <code>Inet6Address</code>. Similar problem fixed for JDBC. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2342">ClickHouse/clickhouse-java#2342</a>)</li>
<li>[jdbc-v2] Fixed changing DB schema (DB name) on connection when <code>USE</code> statement executed. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2137">ClickHouse/clickhouse-java#2137</a>)</li>
<li>[client-v2] Fixed serializing POJO with primitive <code>boolean</code> fields. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2248">ClickHouse/clickhouse-java#2248</a>)</li>
</ul>
<h2>0.8.5</h2>
<h3>Improvements</h3>
<ul>
<li>[jdbc-v2] Added debug output for final SQL. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2249">ClickHouse/clickhouse-java#2249</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>[client-v2] Fixed creating TableSchema for materialized views. It resolves issues with POJO serde. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2118">ClickHouse/clickhouse-java#2118</a>,
<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2025">ClickHouse/clickhouse-java#2025</a>)</li>
<li>[client-v2, jdbc-v2] Fixed handling <code>Nullable</code> inside <code>SimpleAggregateFunction</code> columns. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2110">ClickHouse/clickhouse-java#2110</a>)</li>
<li>[jdbc-v2] Fixed problem with server info request. It is fetched now when timezone of the server is set. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2191">ClickHouse/clickhouse-java#2191</a>)</li>
<li>[jdbc-v2] Fixed null response for <code>getIndexInfo()</code>. Empty Result Set is returned. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2286">ClickHouse/clickhouse-java#2286</a>)</li>
<li>[jdbc-v2] Fixed wrong <code>false</code> response in <code>DataBaseMetadata.supportsBatchUpdates()</code>. Returns <code>true</code> now. Please note that
no update is supported for result sets.</li>
<li>[jdbc-v2] Fixed handling UUID data type in PreparedStatement. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2327">ClickHouse/clickhouse-java#2327</a>)</li>
<li>[jdbc-v2] Fixed unsigned integer type matching. <code>UInt8</code>, <code>UInt16</code>, <code>UInt32</code>, <code>UInt64</code>, <code>UInt128</code>, <code>UInt256</code> are presented as
<code>short</code>, <code>int</code>, <code>long</code>, <code>BigInteger</code>, <code>BigInteger</code>, <code>BigInteger</code> correspondingly. SQLType for them is <code>OTHER</code> because
JDBC (as well as Java) doesn't provide good mapping for unsigned integers. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2333">ClickHouse/clickhouse-java#2333</a>)</li>
<li>[jdbc-v2] Disallowed to call method from <code>Statement</code> interface on <code>PreparedStatement</code> instance according to the JDBC spec. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2339">ClickHouse/clickhouse-java#2339</a>)</li>
</ul>
<h2>0.8.4</h2>
<h3>Examples</h3>
<ul>
<li>[jdbc-v2] - JPA example added. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/pull/2301">ClickHouse/clickhouse-java#2301</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>[jdbc-v2] Added implementation of <code>ResultSetMetaData.getColumnClassName()</code> to return information
about class name of the value stored in a result. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2112">ClickHouse/clickhouse-java#2112</a>)</li>
<li>[client-v2] Fixed NPE when <code>Client.queryAll</code> used with <code>INSERT</code> statement because internally <code>columns</code> variable
was accessed and was null. (<a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2150">ClickHouse/clickhouse-java#2150</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/2d305b75e704146c2a515edf751a57c4350eaca0"><code>2d305b7</code></a> Merge pull request <a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2373">#2373</a> from ClickHouse/pre_0.8.6</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/832de2e8d05f7f8cd258f7d9c5c540a25b71762f"><code>832de2e</code></a> Updated version and change log</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/2be5d781efc7908a28abefa4d0adb133736acb66"><code>2be5d78</code></a> Merge pull request <a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2372">#2372</a> from ClickHouse/add-bool-serialization</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/b61cacc725098f6341018f11edcd7d2ea7989053"><code>b61cacc</code></a> Add Bool serialization support</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/db6035176c325410a30a6c58f28845e9c1d8e8cb"><code>db60351</code></a> Merge pull request <a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2369">#2369</a> from ClickHouse/fix_ip_v6</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/dfd5880c017dc0882db0196d9bded86dce53d33f"><code>dfd5880</code></a> Merge pull request <a href="https://redirect.github.com/ClickHouse/clickhouse-java/issues/2367">#2367</a> from ClickHouse/tweak-array-conversion</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/bdb05dc34065b8b04a4035798c798f24fe111249"><code>bdb05dc</code></a> Update JdbcUtils.java</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/d19eab5378187cf1891df2f0c1c7e0345228579d"><code>d19eab5</code></a> fixed review comments</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/0d3e01074f9b55ee61b342c5a67697be11f315c3"><code>0d3e010</code></a> added JDBC tests</li>
<li><a href="https://github.com/ClickHouse/clickhouse-java/commit/218cf1f0b83431f5323df2852d38ce52f2c03ae6"><code>218cf1f</code></a> fixed ip address conversion</li>
<li>Additional commits viewable in <a href="https://github.com/ClickHouse/clickhouse-java/compare/v0.8.3...v0.8.6">compare view</a></li>
</ul>
</details>
<br />


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

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually 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>

codecov-commenter: ## [Codecov](https://app.codecov.io/gh/alibaba/fastjson2/pull/3567?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.73%. Comparing base [(`ab36a71`)](https://app.codecov.io/gh/alibaba/fastjson2/commit/ab36a7104c38cc557dab34e22eb4fded8734dd17?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba) to head [(`d1f7f32`)](https://app.codecov.io/gh/alibaba/fastjson2/commit/d1f7f32f43bf16a3ba2898cdb9732c2cf7077b2a?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=alibaba).
> Report is 1 commits behind head on main.

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


```diff
@@             Coverage Diff              @@
##               main    #3567      +/-   ##
============================================
- Coverage     73.77%   72.73%   -1.04%     
+ Complexity    23820    23331     -489     
============================================
  Files           682      670      -12     
  Lines         90839    89953     -886     
  Branches      20658    20452     -206     
============================================
- Hits          67015    65427    -1588     
- Misses        15519    16188     +669     
- Partials       8305     8338      +33     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/alibaba/fastjson2/pull/3567?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/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/ObjectReaderBaseModule.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBaseModule.java
index 55a47a052..f139c7e7a 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;
                 }
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/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/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/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/pom.xml b/pom.xml
index 7e153a469..a7cef5923 100644
--- a/pom.xml
+++ b/pom.xml
@@ -280,7 +280,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>


Test patch:
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/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/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 @@
+{
+}