feat: SimApiSerialization 全反射 JSON 序列化库 v1

对齐 .NET System.Text.Json:
- JsonSerializer.Serialize(obj, JsonOption) / Deserialize<T>(jsonString, JsonOption)
- @JsonPropertyName / @JsonIgnore 特性(运行时注解反射)
- JsonOption:PropertyNamingPolicy(None/CamelCase/SnakeCase)、ignoreNull、maxDepth
- 全反射实现:基础类型/枚举/Option/Array/ArrayList/HashSet/HashMap/嵌套对象
- 仓颉特性适配:
  * Option 是泛型枚举 → EnumTypeInfo.destruct/construct 处理
  * 集合 get(i) 返回 Option<T> → Some/None 解包迭代
  * 集合泛型不变 → 反射方法调用(toArray/get/add/keys)而非 cast
  * as 返回 Option → ?? 解包;JsonKind 用 is 判断
- 已知限制:反序列化需无参构造+var 字段;父类字段不序列化(平台严格类型校验);
  枚举按名字;循环引用用深度上限保护
- 已实测:User 完整回环 + 数组/HashMap 回环 + 特性生效
This commit is contained in:
2026-08-17 10:47:51 +08:00
commit 8d10c31473
9 changed files with 732 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2025 SimcuTeam. All rights reserved.
* 对齐 .NET System.Text.Json.Serialization 特性:
* - [JsonPropertyName("xxx")] → @JsonPropertyName["xxx"] 指定字段的 JSON 名称
* - [JsonIgnore] → @JsonIgnore 序列化/反序列化时忽略该字段
*
* 参考仓颉官方注解用法(std.reflect 运行时读取):
* https://docs.cangjie-lang.cn/en/docs/1.0.0/libs/std/reflect/reflect_samples/annotation.html
*/
package simapi_serialization.attributes
/**
* 指定字段的 JSON 名称(对齐 .NET JsonPropertyNameAttribute)。
* 用法:@JsonPropertyName["user_name"] public var _username: String = ""
*/
@Annotation[target: [MemberVariable, MemberProperty]]
public class JsonPropertyName {
public let name: String
public const init(name: String) {
this.name = name
}
}
/**
* 标记字段不做 JSON 处理(对齐 .NET JsonIgnoreAttribute)。
* 用法:@JsonIgnore public var _temp: String = ""
*/
@Annotation[target: [MemberVariable, MemberProperty]]
public class JsonIgnore {
public const init() {}
}