From 04688d08b111232c32f56ab5d598cbd61d80c2ef Mon Sep 17 00:00:00 2001 From: yanxutao89 <910135896@qq.com> Date: Sun, 14 Apr 2024 23:14:18 +0800 Subject: [PATCH] fix hash collision for codegen --- .../processor/issues/Issue2411Bean.java | 46 +++++++++++++++++++ .../JSONCompiledAnnotationProcessor.java | 2 +- .../JSONCompiledAnnotationProcessor2.java | 7 ++- 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 codegen-test/src/test/java/com/alibaba/fastjson2/internal/processor/issues/Issue2411Bean.java diff --git a/codegen-test/src/test/java/com/alibaba/fastjson2/internal/processor/issues/Issue2411Bean.java b/codegen-test/src/test/java/com/alibaba/fastjson2/internal/processor/issues/Issue2411Bean.java new file mode 100644 index 0000000000..e80f7322ce --- /dev/null +++ b/codegen-test/src/test/java/com/alibaba/fastjson2/internal/processor/issues/Issue2411Bean.java @@ -0,0 +1,46 @@ +package com.alibaba.fastjson2.internal.processor.issues; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.annotation.JSONCompiled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue2411Bean { + static JSONWriter.Feature[] writerFeatures = { + JSONWriter.Feature.FieldBased, + JSONWriter.Feature.WriteNameAsSymbol + }; + static JSONReader.Feature[] readerFeatures = { + JSONReader.Feature.UseDefaultConstructorAsPossible, + JSONReader.Feature.ErrorOnNoneSerializable, JSONReader.Feature.IgnoreAutoTypeNotMatch, + JSONReader.Feature.UseNativeObject, JSONReader.Feature.FieldBased + }; + + @Test + public void test() { + Bean course = new Bean(); + course.courseId = "6bad799a1c894893bedade17215244a1"; + course.userId = "4b99d48f87f84868a59aa3b3ce82fd56"; + + String json = JSON.toJSONString(course, writerFeatures); + + Bean result = JSON.parseObject(json, Bean.class, readerFeatures); + + assertEquals(course.userId, result.userId); + assertEquals(course.courseId, result.courseId); + } + + @JSONCompiled + public static class Bean { + public String courseId; + public String userId; + public String studyRate; + public String resourceId; + public String providerCorpCode; + public String userAgent; + public String sourceId; + } +} diff --git a/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor.java b/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor.java index 0bc9b84a72..b1972d9161 100644 --- a/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor.java +++ b/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor.java @@ -823,8 +823,8 @@ private static void genRead243( Block.IfStmt nextIfMatchStmt = label.ifStmt(nextIfMatch); genReadFieldValue(nextIfMatchStmt, fieldReaderIndex, info, fieldReader, jsonReader, object, forLabel, false); nextIfMatchStmt.continueStmt(forLabel); - label.breakStmt(); } + label.breakStmt(); } } diff --git a/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor2.java b/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor2.java index 4839487c97..101089d75a 100644 --- a/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor2.java +++ b/codegen/src/main/java/com/alibaba/fastjson2/internal/processor/JSONCompiledAnnotationProcessor2.java @@ -292,7 +292,7 @@ private JCTree.JCMethodDecl genReadObject(JCTree.JCIdent objectType, JCTree.JCEx JCTree.JCLabeledStatement switchLabel = label("_switch", null); ListBuffer cases = new ListBuffer<>(); - for (int i = 0; i < fieldsSize; ++i) { + for (int i = 0; i < hashCode32Keys.length; ++i) { java.util.List hashCode64Array = map.get(hashCode32Keys[i]); List stmts = List.nil(); Long fieldNameHash = null; @@ -457,6 +457,7 @@ private List genRead243( for (int i = 0; i < labels.length; i++) { int name0 = switchKeys[i]; java.util.List fieldReaders = name0Map.get(name0); + ListBuffer caseStmts = new ListBuffer<>(); for (int j = 0; j < fieldReaders.size(); j++) { AttributeInfo fieldReader = fieldReaders.get(j); int fieldReaderIndex = readerIndexMap.get(fieldReader); @@ -834,8 +835,10 @@ private List genRead243( throw new IllegalStateException("fieldNameLength " + fieldNameLength); } List readFieldValueStmts = genReadFieldValue(fieldReader, jsonReaderIdent, fieldReaderIndex, structInfo, loopLabel, objectIdent, isJsonb); - cases.append(defCase(literal(name0), List.of(defIf(nextIfMethod, block(readFieldValueStmts), null), defBreak(switchLabel)))); + caseStmts.append(defIf(nextIfMethod, block(readFieldValueStmts), null)); } + caseStmts.append(defBreak(switchLabel)); + cases.append(defCase(literal(name0), caseStmts.toList())); } switchLabel.body = defSwitch(method(field(jsonReaderIdent, "getRawInt")), cases.toList()); stmts = stmts.append(switchLabel);