You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2026/10/15 23:19:53 UTC

(commons-lang) branch master updated: Escape CharSequence values in ToStringStyle.JSON_STYLE (#1821)

This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 1c1a79822 Escape CharSequence values in ToStringStyle.JSON_STYLE (#1821)
1c1a79822 is described below

commit 1c1a7982206c915d3470e89af2366e34c1b21d23
Author: alhuda <50...@users.noreply.github.com>
AuthorDate: Fri Oct 16 04:49:47 2026 +0530

    Escape CharSequence values in ToStringStyle.JSON_STYLE (#1821)
    
    JsonToStringStyle.appendDetail(StringBuffer, String, Object) quotes and
    escapes only String and Character values. Any other value whose
    toString() is wrapped in {} or [] is appended raw, which is meant for
    nested objects that already render as JSON. A StringBuilder or other
    non-String CharSequence holding brace-wrapped text therefore went out
    unescaped and could inject keys into the output. Treat every
    CharSequence as a string value.
---
 .../java/org/apache/commons/lang3/builder/ToStringStyle.java   |  2 +-
 .../apache/commons/lang3/builder/JsonToStringStyleTest.java    | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
index 50f5723c2..b2729381b 100644
--- a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
+++ b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
@@ -256,7 +256,7 @@ protected void appendDetail(final StringBuffer buffer, final String fieldName, f
                 appendNullText(buffer, fieldName);
                 return;
             }
-            if (value instanceof String || value instanceof Character) {
+            if (value instanceof CharSequence || value instanceof Character) {
                 appendValueAsString(buffer, value.toString());
                 return;
             }
diff --git a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
index 3925cdd63..702fdbf94 100644
--- a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
@@ -265,6 +265,16 @@ void testCharArray() {
         assertThrows(UnsupportedOperationException.class, () -> toStringBuilder.append((Object) array).toString());
     }
 
+    @Test
+    void testCharSequenceIsEscaped() {
+        final String text = "{},\"admin\":true,\"x\":{}";
+        final String expected = "{\"name\":\"{},\\\"admin\\\":true,\\\"x\\\":{}\"}";
+        assertEquals(expected, new ToStringBuilder(base).append("name", text).toString());
+        assertEquals(expected, new ToStringBuilder(base).append("name", new StringBuilder(text)).toString());
+        assertEquals(expected, new ToStringBuilder(base).append("name", new StringBuffer(text)).toString());
+        assertEquals("{\"name\":[\"[1]\"]}", new ToStringBuilder(base).append("name", Arrays.asList(new StringBuilder("[1]"))).toString());
+    }
+
     @Test
     void testCombineListAndEnum() {
         final Teacher teacher = new Teacher();