diff --git a/core/src/main/java/com/alibaba/fastjson2/function/impl/StringToAny.java b/core/src/main/java/com/alibaba/fastjson2/function/impl/StringToAny.java index 12954d28ca..5fedd2788d 100644 --- a/core/src/main/java/com/alibaba/fastjson2/function/impl/StringToAny.java +++ b/core/src/main/java/com/alibaba/fastjson2/function/impl/StringToAny.java @@ -64,7 +64,12 @@ public Object apply(Object from) { } if (targetClass == boolean.class || targetClass == Boolean.class) { - return "true".equals(str); + if ("true".equalsIgnoreCase(str) + || "T".equalsIgnoreCase(str) + || "Y".equalsIgnoreCase(str)) { + return Boolean.TRUE; + } + return Boolean.FALSE; } if (targetClass == BigDecimal.class) { diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_7800/Issue7842.java b/core/src/test/java/com/alibaba/fastjson2/issues_7800/Issue7842.java new file mode 100644 index 0000000000..da6aad2644 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues_7800/Issue7842.java @@ -0,0 +1,48 @@ +package com.alibaba.fastjson2.issues_7800; + +import com.alibaba.fastjson2.util.TypeUtils; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Tag("regression") +public class Issue7842 { + @Test + public void testTrueSpellings() { + for (String s : new String[]{"true", "TRUE", "True", "T", "t", "Y", "y"}) { + assertTrue(TypeUtils.cast(s, Boolean.class), s); + } + } + + @Test + public void testFalseSpellings() { + for (String s : new String[]{"false", "FALSE", "False", "0", "F", "f", "N", "n"}) { + assertFalse(TypeUtils.cast(s, Boolean.class), s); + } + } + + @Test + public void testLenientFallback() { + assertFalse(TypeUtils.cast("abc", Boolean.class)); + assertFalse(TypeUtils.cast("2", Boolean.class)); + assertFalse(TypeUtils.cast("YES", Boolean.class)); + // "1" stays false: pinned by JSONObjectTest.test_invoke, do not change it here + assertFalse(TypeUtils.cast("1", Boolean.class)); + assertNull(TypeUtils.cast("", Boolean.class)); + assertNull(TypeUtils.cast("null", Boolean.class)); + assertNull(TypeUtils.cast(null, Boolean.class)); + } + + @Test + public void testPrimitive() { + assertEquals(Boolean.TRUE, TypeUtils.cast("TRUE", boolean.class)); + assertEquals(Boolean.FALSE, TypeUtils.cast("1", boolean.class)); + assertEquals(Boolean.FALSE, TypeUtils.cast("FALSE", boolean.class)); + assertEquals(Boolean.FALSE, TypeUtils.cast("abc", boolean.class)); + assertEquals(Boolean.FALSE, TypeUtils.cast("", boolean.class)); + } +}