diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java index e7b7044439..6096af8e77 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java @@ -275,6 +275,12 @@ public ObjectReader createObjectReader( match = false; break; } + + if (fieldReader.fieldClass == Number.class + && !Number.class.equals(fieldReader.fieldType)) { + match = false; + break; + } } } @@ -393,6 +399,12 @@ protected ObjectReaderNoneDefaultConstructor createNoneDefaultConstructorObj match = false; break; } + + if (fieldReader.fieldClass == Number.class + && !Number.class.equals(fieldReader.fieldType)) { + match = false; + break; + } } } diff --git a/test-jdk17/src/test/java/com/alibaba/fastjson2/issues/Issue3156.java b/test-jdk17/src/test/java/com/alibaba/fastjson2/issues/Issue3156.java index 83ff08d389..6a767c9b6d 100644 --- a/test-jdk17/src/test/java/com/alibaba/fastjson2/issues/Issue3156.java +++ b/test-jdk17/src/test/java/com/alibaba/fastjson2/issues/Issue3156.java @@ -1,14 +1,17 @@ package com.alibaba.fastjson2.issues; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; import lombok.Data; +import lombok.NoArgsConstructor; import org.junit.jupiter.api.Test; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; public class Issue3156 { @Test @@ -66,39 +69,51 @@ public record ListResult(int code, String msg, List datas) { public record MapListResult(int code, String msg, Map> data) { } -// public static class AjaxResult { -// private int code; -// private String msg; -// private T data; -// -// public AjaxResult() { -// } -// -// public int getCode() { -// return code; -// } -// -// public AjaxResult setCode(int code) { -// this.code = code; -// return this; -// } -// -// public String getMsg() { -// return msg; -// } -// -// public AjaxResult setMsg(String msg) { -// this.msg = msg; -// return this; -// } -// -// public T getData() { -// return data; -// } -// -// public AjaxResult setData(T data) { -// this.data = data; -// return this; -// } -// } + @Test + public void test_2() { // 泛型 无默认构造器 + String json = "{\"temperature\":{\"enabled\":true,\"value\":0.1},\"presencePenalty\":{\"enabled\":false,\"value\":0},\"frequencyPenalty\":{\"enabled\":false,\"value\":0},\"maxToken\":{\"enabled\":false,\"value\":1024}}"; + Options options = JSONObject.parseObject(json, new TypeReference() {}); + Object val = options.getTemperature().value(); + Object val2 = options.getPresencePenalty().value(); + Object val3 = options.getMaxToken().value(); + assertInstanceOf(Double.class, val); + assertInstanceOf(Double.class, val2); + assertInstanceOf(Integer.class, val3); + } + + @Data + public static class Options { + private Parameter temperature; + private Parameter presencePenalty; + private Parameter frequencyPenalty; + private Parameter maxToken; + public record Parameter(Boolean enabled, T value) {} + } + + @Test + public void test_3() { // 泛型 有默认构造器 + String json = "{\"temperature\":{\"enabled\":true,\"value\":0.1},\"presencePenalty\":{\"enabled\":false,\"value\":0},\"frequencyPenalty\":{\"enabled\":false,\"value\":0},\"maxToken\":{\"enabled\":false,\"value\":1024}}"; + Options2 options = JSONObject.parseObject(json, new TypeReference() {}); + Object val = options.getTemperature().getValue(); + Object val2 = options.getPresencePenalty().getValue(); + Object val3 = options.getMaxToken().getValue(); + assertInstanceOf(Double.class, val); + assertInstanceOf(Double.class, val2); + assertInstanceOf(Integer.class, val3); + } + + @Data + public static class Options2 { + private Parameter temperature; + private Parameter presencePenalty; + private Parameter frequencyPenalty; + private Parameter maxToken; + + @NoArgsConstructor + @Data + public static class Parameter{ + private Boolean enabled; + private T value; + } + } }