Skip to content

Commit

Permalink
fix : first char uppercase field name serialize & deserialize, for is…
Browse files Browse the repository at this point in the history
…sue #924
  • Loading branch information
wenshao committed Nov 12, 2022
1 parent 6a23b3c commit 6dccf59
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@ public <T> Function<Map<Long, Object>, T> createFunction(Constructor constructor
return new ConstructorFunction(constructor, paramNames);
}

public <T> Function<Map<Long, Object>, T> createFunction(Constructor constructor, Constructor markerConstructor, String... paramNames) {
public <T> Function<Map<Long, Object>, T> createFunction(Constructor constructor,
Constructor markerConstructor,
String... paramNames) {
if (markerConstructor == null) {
constructor.setAccessible(true);
} else {
Expand Down Expand Up @@ -577,7 +579,9 @@ public <T> ObjectReader<T> createObjectReader(Class<T> objectType, boolean field
);
}

protected ObjectReader getAnnotatedObjectReader(ObjectReaderProvider provider, Class objectClass, BeanInfo beanInfo) {
protected ObjectReader getAnnotatedObjectReader(ObjectReaderProvider provider,
Class objectClass,
BeanInfo beanInfo) {
if ((beanInfo.readerFeatures & JSON_AUTO_WIRED_ANNOTATED) == 0) {
return null;
}
Expand Down Expand Up @@ -976,16 +980,30 @@ protected void createFieldReader(
fieldName = BeanUtils.getterName(method, namingStrategy);
}

if (fieldName.length() > 2
&& fieldName.charAt(0) >= 'A' && fieldName.charAt(0) <= 'Z'
&& fieldName.charAt(1) >= 'A' && fieldName.charAt(1) <= 'Z'
char c0 = '\0', c1;
int len = fieldName.length();
if (len > 0) {
c0 = fieldName.charAt(0);
}

if ((len == 1 && c0 >= 'a' && c0 <= 'z')
|| (len > 2 && c0 >= 'A' && c0 <= 'Z' && (c1 = fieldName.charAt(1)) >= 'A' && c1 <= 'Z')
) {
char[] chars = fieldName.toCharArray();
chars[0] = (char) (chars[0] + 32);
if (len == 1) {
chars[0] = (char) (chars[0] - 32);
} else {
chars[0] = (char) (chars[0] + 32);
}
String fieldName1 = new String(chars);
Field field = BeanUtils.getDeclaredField(objectClass, fieldName1);
if (field != null && Modifier.isPublic(field.getModifiers())) {
fieldName = field.getName();
if (field != null) {
if (Modifier.isPublic(field.getModifiers())) {
fieldName = field.getName();
} else if (len == 1) {
fieldInfo.alternateNames = new String[]{fieldName};
fieldName = field.getName();
}
}
}
} else {
Expand Down Expand Up @@ -1104,7 +1122,11 @@ protected void createFieldReader(
}
}

protected <T> FieldReader[] createFieldReaders(Class<T> objectClass, Type objectType, BeanInfo beanInfo, boolean fieldBased, ObjectReaderProvider provider) {
protected <T> FieldReader[] createFieldReaders(Class<T> objectClass,
Type objectType,
BeanInfo beanInfo,
boolean fieldBased,
ObjectReaderProvider provider) {
if (beanInfo == null) {
beanInfo = new BeanInfo();
for (ObjectReaderModule module : provider.modules) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,29 @@ public ObjectWriter createObjectWriter(
String fieldName;
if (fieldInfo.fieldName == null || fieldInfo.fieldName.isEmpty()) {
fieldName = BeanUtils.getterName(method, beanInfo.namingStrategy);

char c0 = '\0', c1;
int len = fieldName.length();
if (len > 0) {
c0 = fieldName.charAt(0);
}

if ((len == 1 && c0 >= 'a' && c0 <= 'z')
|| (len > 2 && c0 >= 'A' && c0 <= 'Z' && (c1 = fieldName.charAt(1)) >= 'A' && c1 <= 'Z')
) {
char[] chars = fieldName.toCharArray();
if (c0 >= 'a' && c0 <= 'z') {
chars[0] = (char) (chars[0] - 32);
} else {
chars[0] = (char) (chars[0] + 32);
}
String fieldName1 = new String(chars);
Field field = BeanUtils.getDeclaredField(objectClass, fieldName1);

if (field != null && (len == 1 || Modifier.isPublic(field.getModifiers()))) {
fieldName = field.getName();
}
}
} else {
fieldName = fieldInfo.fieldName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,15 +259,25 @@ boolean record = BeanUtils.isRecord(objectClass);
} else {
fieldName = BeanUtils.getterName(method, beanInfo.namingStrategy);

if (fieldName.length() > 2
&& fieldName.charAt(0) >= 'A' && fieldName.charAt(0) <= 'Z'
&& fieldName.charAt(1) >= 'A' && fieldName.charAt(1) <= 'Z'
char c0 = '\0', c1;
int len = fieldName.length();
if (len > 0) {
c0 = fieldName.charAt(0);
}

if ((len == 1 && c0 >= 'a' && c0 <= 'z')
|| (len > 2 && c0 >= 'A' && c0 <= 'Z' && (c1 = fieldName.charAt(1)) >= 'A' && c1 <= 'Z')
) {
char[] chars = fieldName.toCharArray();
chars[0] = (char) (chars[0] + 32);
if (c0 >= 'a' && c0 <= 'z') {
chars[0] = (char) (chars[0] - 32);
} else {
chars[0] = (char) (chars[0] + 32);
}
String fieldName1 = new String(chars);
Field field = BeanUtils.getDeclaredField(objectClass, fieldName1);
if (field != null && Modifier.isPublic(field.getModifiers())) {

if (field != null && (len == 1 || Modifier.isPublic(field.getModifiers()))) {
fieldName = field.getName();
}
}
Expand Down Expand Up @@ -2746,7 +2756,10 @@ private void gwFieldValueString(
mw.visitLabel(endIfNull_);
}

private void genMethodInit(List<FieldWriter> fieldWriters, ClassWriter cw, String classNameType, String objectWriterSupper) {
private void genMethodInit(List<FieldWriter> fieldWriters,
ClassWriter cw,
String classNameType,
String objectWriterSupper) {
MethodWriter mw = cw.visitMethod(
Opcodes.ACC_PUBLIC,
"<init>",
Expand Down
109 changes: 109 additions & 0 deletions core/src/test/java/com/alibaba/fastjson2/issues/Issue924.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package com.alibaba.fastjson2.issues;

import com.alibaba.fastjson2.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue924 {
@Test
public void test() {
Entity entity = new Entity(101L);
String json = JSON.toJSONString(entity);
assertEquals("{\"C\":101}", json);

Entity entity1 = JSON.parseObject(json, Entity.class);
assertEquals(entity.C, entity1.C);

Entity entity2 = JSON.parseObject("{\"c\":101}", Entity.class);
assertEquals(entity.C, entity2.C);
}

@Test
public void test1() {
Entity1 entity = new Entity1(101L);
String json = JSON.toJSONString(entity);
assertEquals("{\"C\":101}", json);

Entity1 entity1 = JSON.parseObject(json, Entity1.class);
assertEquals(entity.C, entity1.C);

Entity1 entity2 = JSON.parseObject("{\"c\":101}", Entity1.class);
assertEquals(entity.C, entity2.C);
}

@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Entity {
private Long C;
}

@AllArgsConstructor
@NoArgsConstructor
@Data
private static class Entity1 {
private Long C;
}

@Test
public void test2() {
Entity2 entity = new Entity2();
entity.ID = 101L;
String json = JSON.toJSONString(entity);
assertEquals("{\"ID\":101}", json);

Entity2 entity1 = JSON.parseObject(json, Entity2.class);
assertEquals(entity.ID, entity1.ID);

Entity2 entity2 = JSON.parseObject("{\"id\":101}", Entity2.class);
assertEquals(entity.ID, entity2.ID);
}

public static class Entity2 {
private Long ID;

public Entity2() {
}

public Long getID() {
return ID;
}

public void setID(Long id) {
this.ID = id;
}
}

@Test
public void test3() {
Entity3 entity = new Entity3();
entity.ID = 101L;
String json = JSON.toJSONString(entity);
assertEquals("{\"ID\":101}", json);

Entity3 entity1 = JSON.parseObject(json, Entity3.class);
assertEquals(entity.ID, entity1.ID);

Entity3 entity2 = JSON.parseObject("{\"id\":101}", Entity3.class);
assertEquals(entity.ID, entity2.ID);
}

private static class Entity3 {
private Long ID;

public Entity3() {
}

public Long getID() {
return ID;
}

public void setID(Long id) {
this.ID = id;
}
}
}
3 changes: 2 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,8 @@
com/alibaba/fastjson2/naming/*.java,
com/alibaba/json/bvt/**/*.java,
com/alibaba/fastjson2/issues/Issue485.java,
com/alibaba/fastjson2/issues/Issue765.java
com/alibaba/fastjson2/issues/Issue765.java,
com/alibaba/fastjson2/issues/Issue924.java
</excludes>
</configuration>
</execution>
Expand Down

0 comments on commit 6dccf59

Please # to comment.