diff --git a/cjpm.toml b/cjpm.toml index 026bd01..c4ce4cb 100644 --- a/cjpm.toml +++ b/cjpm.toml @@ -3,6 +3,7 @@ name = "simapi_serialization" description = "SimApi 全反射 JSON 序列化库(对齐 .NET JsonSerializer.Serialize/Deserialize + SerializerPropertyName/SerializerIgnore 特性)" version = "1.0.0" + org = "simcu" target-dir = "" output-type = "static" diff --git a/src/common/Annotations.cj b/src/common/Annotations.cj index 2f7700d..4520621 100644 --- a/src/common/Annotations.cj +++ b/src/common/Annotations.cj @@ -7,9 +7,6 @@ * 设计决策:本库序列化/反序列化只处理「var 成员变量」(std.reflect 的 instanceVariables), * 不处理 prop 属性(instanceProperties)。因此注解 target 仅限 MemberVariable: * 标到 prop 上会直接编译报错,避免「标了但不生效」的静默陷阱。 - * - * 参考仓颉官方注解用法(std.reflect 运行时读取): - * https://docs.cangjie-lang.cn/en/docs/1.0.0/libs/std/reflect/reflect_samples/annotation.html */ package simapi_serialization.common diff --git a/src/json/JsonOption.cj b/src/json/JsonOption.cj index 2c77df0..d5f7938 100644 --- a/src/json/JsonOption.cj +++ b/src/json/JsonOption.cj @@ -23,5 +23,5 @@ public class JsonOption { public init() {} /// 默认选项实例 - public static let instance = JsonOption() + public static let instance: JsonOption = JsonOption() } diff --git a/src/json/JsonReader.cj b/src/json/JsonReader.cj index 017178f..b37cfbf 100644 --- a/src/json/JsonReader.cj +++ b/src/json/JsonReader.cj @@ -137,14 +137,14 @@ public class JsonReader { } } // 父类字段(@SerializerParent 宏生成的静态导入方法,沿继承链逐层回填) - readParentFields(value, ct, instance, options) + readParentFields(value, ct, instance) instance } /// 沿 superClass 链调用每层的 importJsonFields 静态方法回填父类字段。 /// 无宏的父类(hasImportFields 缓存判断)静默跳过;宏生成的方法内部按 /// if (k == "字段名") 忽略未知键,因此直接把全部 JSON 键传入即可。 - private static func readParentFields(value: JsonValue, ct: ClassTypeInfo, instance: Any, options: JsonOption): Unit { + private static func readParentFields(value: JsonValue, ct: ClassTypeInfo, instance: Any): Unit { let jobj = value.asObject() var parent = ct.superClass while (let Some(p) <- parent) { diff --git a/src/macros/SerializerParentMacro.cj b/src/macros/SerializerParentMacro.cj index d4d954a..3ccb39b 100644 --- a/src/macros/SerializerParentMacro.cj +++ b/src/macros/SerializerParentMacro.cj @@ -134,7 +134,7 @@ private func unwrapMacroField(md: MacroExpandDecl): ?VarDecl { private class FieldVisitor <: Visitor { private var _decl: ?VarDecl = None - public override func visit(decl: VarDecl) { + public override func visit(decl: VarDecl): Unit { _decl = Some(decl) this.breakTraverse() } diff --git a/src/tests/JsonSerializer_test.cj b/src/tests/JsonSerializer_test.cj index f378b27..02154de 100644 --- a/src/tests/JsonSerializer_test.cj +++ b/src/tests/JsonSerializer_test.cj @@ -17,7 +17,7 @@ import simapi_serialization.* import simapi_serialization.macros.* enum Role { | Admin - | User + | Member | Guest } @@ -44,7 +44,7 @@ class User <: BaseUser { public var _age: Int64 = 0 // 下划线字段 public var score: Float64 = 0.0 // 无下划线 public var active: Bool = true // 无下划线 - public var _role: Role = Role.User // 下划线字段(枚举) + public var _role: Role = Role.Member // 下划线字段(枚举) public var opt: ?String = None // 无下划线(Option=Some) public var remark: ?String = None // 无下划线(Option=None → null) public var _tags: Array = [] // 下划线字段(集合) @@ -109,7 +109,7 @@ func makeUser(): User { func roleStr(r: Role): String { match (r) { case Role.Admin => "Admin" - case Role.User => "User" + case Role.Member => "User" case Role.Guest => "Guest" } } @@ -124,7 +124,7 @@ func toStr(x: Any): String { public class JsonSerializerTests { /// 基础类型序列化 @TestCase - public func basicTypes() { + public func basicTypes(): Unit { @Expect(JsonSerializer.Serialize(Int64(42)), "42") @Expect(JsonSerializer.Serialize(Int32(7)), "7") @Expect(JsonSerializer.Serialize(Int16(3)), "3") @@ -137,7 +137,7 @@ public class JsonSerializerTests { /// 对象序列化:下划线保留、注解生效、忽略生效、None→null、父类字段不输出 @TestCase - public func objectSerialize() { + public func objectSerialize(): Unit { let json = JsonSerializer.Serialize(makeUser()) // 下划线字段原样输出 @Expect(json.contains("\"_name\": \"alice\""), true) @@ -171,7 +171,7 @@ public class JsonSerializerTests { /// 对象反序列化往返 @TestCase - public func objectRoundTrip() { + public func objectRoundTrip(): Unit { let json = JsonSerializer.Serialize(makeUser()) let u2 = JsonSerializer.Deserialize(json) @Expect(u2._name, "alice") @@ -203,7 +203,7 @@ public class JsonSerializerTests { /// Array 往返 @TestCase - public func arrayRoundTrip() { + public func arrayRoundTrip(): Unit { let json = JsonSerializer.Serialize(["x", "y", "z"]) let arrBack = JsonSerializer.Deserialize>(json) @Expect(arrBack.size, Int64(3)) @@ -213,7 +213,7 @@ public class JsonSerializerTests { /// ArrayList 往返 @TestCase - public func arrayListRoundTrip() { + public func arrayListRoundTrip(): Unit { var list = ArrayList() list.add("a") list.add("b") @@ -226,7 +226,7 @@ public class JsonSerializerTests { /// HashSet 往返 @TestCase - public func hashSetRoundTrip() { + public func hashSetRoundTrip(): Unit { var set = HashSet() set.add("x") set.add("y") @@ -238,7 +238,7 @@ public class JsonSerializerTests { /// HashMap 往返 @TestCase - public func hashMapRoundTrip() { + public func hashMapRoundTrip(): Unit { let m = HashMap() m["k1"] = "v1" m["k2"] = Int64(42) @@ -250,7 +250,7 @@ public class JsonSerializerTests { /// 命名策略:NONE / CAMEL / SNAKE 对当前模型(全小写+下划线)输出一致 @TestCase - public func namingPolicies() { + public func namingPolicies(): Unit { let optNone = JsonOption() optNone.propertyNamingPolicy = PropertyNamingPolicy.Keep let jsonNone = JsonSerializer.Serialize(makeUser(), optNone) @@ -270,7 +270,7 @@ public class JsonSerializerTests { /// 命名策略转换规则(直接单测) @TestCase - public func applyNamingPolicy() { + public func applyNamingPolicy(): Unit { // SnakeCase:大写转 _小写 @Expect(ReflectionCache.applyNamingPolicy("userName", PropertyNamingPolicy.SnakeCase), "user_name") @Expect(ReflectionCache.applyNamingPolicy("userNameAge", PropertyNamingPolicy.SnakeCase), "user_name_age") @@ -285,7 +285,7 @@ public class JsonSerializerTests { /// 枚举序列化/反序列化 @TestCase - public func enumSerialize() { + public func enumSerialize(): Unit { @Expect(JsonSerializer.Serialize(Role.Admin), "\"Admin\"") @Expect(JsonSerializer.Serialize(Role.Guest), "\"Guest\"") let u = User() @@ -296,7 +296,7 @@ public class JsonSerializerTests { /// Option 字段:null → None,值 → Some @TestCase - public func optionField() { + public func optionField(): Unit { let none: ?String = JsonSerializer.Deserialize("null") @Expect(none.isNone(), true) let some: ?String = JsonSerializer.Deserialize("\"hi\"") @@ -308,7 +308,7 @@ public class JsonSerializerTests { /// 宽松类型转换:JSON 数字 ↔ 字符串字段互转 @TestCase - public func looseConversion() { + public func looseConversion(): Unit { // 数字 → String 字段 let s: String = JsonSerializer.Deserialize("42") @Expect(s, "42") @@ -325,7 +325,7 @@ public class JsonSerializerTests { /// 深度限制:超过 maxDepth 抛异常 @TestCase - public func maxDepth() { + public func maxDepth(): Unit { let opt = JsonOption() opt.maxDepth = 0 let u = User() @@ -341,7 +341,7 @@ public class JsonSerializerTests { /// 父类字段序列化/反序列化(@SerializerParent 宏):已并入 objectSerialize/objectRoundTrip, /// 此处验证宏生成的静态方法可直接调用 @TestCase - public func parentMacroMethods() { + public func parentMacroMethods(): Unit { let u = User() u._id = "m-1" u._createdAt = "2025-02-02" @@ -365,7 +365,7 @@ public class JsonSerializerTests { /// 多层继承:爷标宏、中间层不标宏 → 爷字段导出,中间层字段不导出 @TestCase - public func multiLevelInheritance() { + public func multiLevelInheritance(): Unit { let leaf = LeafChild() leaf._gp = "gp-v" leaf._mp = "mp-v" @@ -384,7 +384,7 @@ public class JsonSerializerTests { /// 宏自动补 open:GrandParent 未显式写 open(@SerializerParent 自动补),继承链可正常编译 @TestCase - public func parentAutoOpen() { + public func parentAutoOpen(): Unit { let leaf = LeafChild() leaf._gp = "auto" let json = JsonSerializer.Serialize(leaf) @@ -393,7 +393,7 @@ public class JsonSerializerTests { /// 三级继承(全标宏):爷/父/子 每层字段都导出、反序列化全部回填 @TestCase - public func threeLevelAllMacro() { + public func threeLevelAllMacro(): Unit { let leaf = LeafAll() leaf._ga = "ga-v" leaf._ma = "ma-v" @@ -412,7 +412,7 @@ public class JsonSerializerTests { /// 三级继承:每层字段互不遮蔽(字段名不同),导出顺序无关,值各自正确 @TestCase - public func threeLevelFieldSeparation() { + public func threeLevelFieldSeparation(): Unit { let leaf = LeafAll() leaf._ga = "G" leaf._ma = "M"