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 508d771b1c..dcaf2f5594 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreator.java @@ -1279,6 +1279,11 @@ boolean record = BeanUtils.isRecord(objectClass); String[] parameterNames = beanInfo.createParameterNames; if (record && parameterNames == null) { parameterNames = BeanUtils.getRecordFieldNames(objectClass); + if (beanInfo.namingStrategy != null && parameterNames != null) { + for (int i = 0; i < parameterNames.length; i++) { + parameterNames[i] = BeanUtils.fieldName(parameterNames[i], beanInfo.namingStrategy); + } + } } if (parameterNames == null || parameterNames.length == 0) { 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 882bf38542..0a7adaf998 100644 --- a/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java +++ b/core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreator.java @@ -754,10 +754,11 @@ protected static String getFieldName( String fieldName; if (fieldInfo.fieldName == null || fieldInfo.fieldName.isEmpty()) { if (record) { - fieldName = method.getName(); + fieldName = beanInfo.namingStrategy != null + ? BeanUtils.fieldName(method.getName(), beanInfo.namingStrategy) + : method.getName(); } else { fieldName = BeanUtils.getterName(method, beanInfo.kotlin, beanInfo.namingStrategy); - Field field; if ((provider.userDefineMask & NAME_COMPATIBLE_WITH_FILED) != 0 && (field = BeanUtils.getField(objectClass, method)) != null) { diff --git a/core/src/test/java/com/alibaba/fastjson2/annotation/JSONTypeNamingSnake.java b/core/src/test/java/com/alibaba/fastjson2/annotation/JSONTypeNamingSnake.java index b3b599cea8..75c15bc42d 100644 --- a/core/src/test/java/com/alibaba/fastjson2/annotation/JSONTypeNamingSnake.java +++ b/core/src/test/java/com/alibaba/fastjson2/annotation/JSONTypeNamingSnake.java @@ -52,4 +52,14 @@ public void setBeanName(String beanName) { this.beanName = beanName; } } + + @JSONType(naming = PropertyNamingStrategy.SnakeCase) + static class ClassDto { + public String currencyCode = "840"; + } + + @Test + public void testClass() { + assertEquals("{\"currency_code\":\"840\"}", JSON.toJSONString(new ClassDto())); + } } diff --git a/test-jdk17/src/test/java/com/alibaba/fastjson2/RecordNamingStrategyTest.java b/test-jdk17/src/test/java/com/alibaba/fastjson2/RecordNamingStrategyTest.java new file mode 100644 index 0000000000..a9dd71dba5 --- /dev/null +++ b/test-jdk17/src/test/java/com/alibaba/fastjson2/RecordNamingStrategyTest.java @@ -0,0 +1,47 @@ +package com.alibaba.fastjson2; + +import com.alibaba.fastjson2.annotation.JSONType; +import com.alibaba.fastjson2.reader.ObjectReaderProvider; +import com.alibaba.fastjson2.writer.ObjectWriterProvider; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RecordNamingStrategyTest { + @JSONType(naming = PropertyNamingStrategy.SnakeCase) + public record RecordDto(String currencyCode) {} + + public record GlobalRecordDto(String currencyCode) {} + + @JSONType(naming = PropertyNamingStrategy.SnakeCase) + public record BooleanRecordDto(boolean isActive) {} + + @Test + public void testRecordAnnotationNaming() { + assertEquals("{\"currency_code\":\"840\"}", JSON.toJSONString(new RecordDto("840"))); + assertEquals(new RecordDto("840"), JSON.parseObject("{\"currency_code\":\"840\"}", RecordDto.class)); + } + + @Test + public void testBooleanFieldNotStripped() { + assertEquals("{\"is_active\":true}", JSON.toJSONString(new BooleanRecordDto(true))); + assertEquals(new BooleanRecordDto(true), JSON.parseObject("{\"is_active\":true}", BooleanRecordDto.class)); + } + + @Test + public void testRecordGlobalNaming() { + ObjectWriterProvider writerProvider = JSONFactory.getDefaultObjectWriterProvider(); + ObjectReaderProvider readerProvider = JSONFactory.getDefaultObjectReaderProvider(); + PropertyNamingStrategy prevWriter = writerProvider.getNamingStrategy(); + PropertyNamingStrategy prevReader = readerProvider.getNamingStrategy(); + try { + writerProvider.setNamingStrategy(PropertyNamingStrategy.SnakeCase); + readerProvider.setNamingStrategy(PropertyNamingStrategy.SnakeCase); + assertEquals("{\"currency_code\":\"840\"}", JSON.toJSONString(new GlobalRecordDto("840"))); + assertEquals(new GlobalRecordDto("840"), JSON.parseObject("{\"currency_code\":\"840\"}", GlobalRecordDto.class)); + } finally { + writerProvider.setNamingStrategy(prevWriter); + readerProvider.setNamingStrategy(prevReader); + } + } +}