feat: R 接口支持 JSON 序列化和反序列化
实现功能:
- R 接口继承 json.Marshaler 和 json.Unmarshaler 接口
- MarshalJSON(): 将 R 实例序列化为 JSON 字节数组
- UnmarshalJSON(): 从 JSON 字节数组反序列化到 R 实例
核心特性:
- 支持 struct、map、slice 等所有类型的 JSON 序列化
- 支持嵌套结构的序列化和反序列化
- 自动智能类型转换(如 JSON 数字 float64 -> int/int64)
- 可以对嵌套字段单独序列化(如 rfx.Get("Address"))
测试覆盖:
- TestJSONMarshal: 测试各种类型的序列化
- TestJSONUnmarshal: 测试各种类型的反序列化
- TestJSONRoundTrip: 测试序列化和反序列化的往返一致性
文档更新:
- 在 README 特性列表中添加 JSON 序列化说明
- 新增"JSON 序列化和反序列化"章节
- 包含完整的使用示例和最佳实践
- 说明使用场景:API通信、配置持久化、数据传输、缓存、消息队列等
This commit is contained in:
45
rfx.go
45
rfx.go
@@ -889,3 +889,48 @@ func (r *rfx) IntSlice() []int {
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// MarshalJSON 实现 json.Marshaler 接口
|
||||
// 将当前值序列化为 JSON 字节数组
|
||||
func (r *rfx) MarshalJSON() ([]byte, error) {
|
||||
return json.Marshal(r.Any())
|
||||
}
|
||||
|
||||
// UnmarshalJSON 实现 json.Unmarshaler 接口
|
||||
// 从 JSON 字节数组反序列化到当前值
|
||||
func (r *rfx) UnmarshalJSON(data []byte) error {
|
||||
// 先解析到 any 类型
|
||||
var v any
|
||||
if err := json.Unmarshal(data, &v); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 获取当前值的实际类型
|
||||
target := r.value
|
||||
for target.Kind() == reflect.Ptr || target.Kind() == reflect.Interface {
|
||||
if target.IsNil() {
|
||||
break
|
||||
}
|
||||
target = target.Elem()
|
||||
}
|
||||
|
||||
// 如果当前值无效或为 nil,创建一个新的 map[string]any
|
||||
if !target.IsValid() || !target.CanSet() {
|
||||
r.value = reflect.ValueOf(&v).Elem()
|
||||
return nil
|
||||
}
|
||||
|
||||
// 尝试将解析的值设置到当前值
|
||||
newValue := reflect.ValueOf(v)
|
||||
if newValue.Type().AssignableTo(target.Type()) {
|
||||
target.Set(newValue)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 如果类型不匹配,尝试使用 setValue 进行转换
|
||||
if !r.setValue(target, v) {
|
||||
return fmt.Errorf("rfx: failed to unmarshal JSON into type %s", target.Type())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user