feat: JsonWriter/JsonReader 支持 DateTime 字段(序列化为 yyyy-MM-dd HH:mm:ss 字符串,可反序列化回,含 Option<DateTime>)

This commit is contained in:
2026-08-21 04:09:42 +08:00
parent ab1e04787e
commit 46bd710128
4 changed files with 55 additions and 1 deletions
+12
View File
@@ -12,6 +12,7 @@ package simcu::serialization.json
import std.collection.*
import std.convert.*
import std.reflect.*
import std.time.*
import stdx.encoding.json.*
import simcu::serialization.common.ReflectionCache
import simcu::serialization.common.FieldMetadata
@@ -62,6 +63,7 @@ public class JsonReader {
case "Float64" => return readFloat64(value)
case "Float32" => return Float32(readFloat64(value))
case "Rune" => return readChar(value)
case "DateTime" | "std.time.DateTime" => return readDateTime(value)
case _ => ()
}
@@ -298,6 +300,15 @@ public class JsonReader {
throw Exception("JsonSerializer: 无法转换为 Char")
}
private static func readDateTime(v: JsonValue): DateTime {
let s = readString(v)
try {
return DateTime.parse(s, "yyyy-MM-dd HH:mm:ss")
} catch (_: Exception) {
throw Exception("JsonSerializer: 无法转换为 DateTime: ${s}")
}
}
/// 生成某类型的占位默认值(用于构造 Option<X> 的 NoneNone 的参数槽类型是 X)。
private static func defaultValueFor(typeName: String): Any {
match (typeName) {
@@ -314,6 +325,7 @@ public class JsonReader {
case "Float64" => return Float64(0.0)
case "Float32" => return Float32(0.0)
case "Rune" => return Rune(0)
case "DateTime" | "std.time.DateTime" => return DateTime.parse("1970-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss")
case _ => ()
}
// 集合/对象/枚举:反射无参构造;失败则抛异常