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:
97
reflux.go
97
reflux.go
@@ -1,12 +1,21 @@
|
||||
package reflux
|
||||
|
||||
import "reflect"
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
|
||||
"git.fsdpf.net/go/reflux/valuex"
|
||||
)
|
||||
|
||||
// R 提供了一个统一的接口,用于访问和操作嵌套的结构体字段、切片元素和映射值
|
||||
type R interface {
|
||||
// Get 通过路径获取嵌套字段的值,返回一个新的 R 实例
|
||||
valuex.Accessor
|
||||
json.Marshaler
|
||||
json.Unmarshaler
|
||||
|
||||
// Get 通过路径获取嵌套字段的值,返回一个新的 T 实例
|
||||
// 参数 p 为路径片段,例如 Get("user", "profile", "name")
|
||||
Get(p ...string) R
|
||||
Get(path ...string) R
|
||||
|
||||
// Scope 类似 Get,但用于创建一个指定路径的作用域视图
|
||||
// 后续操作将基于这个作用域进行
|
||||
@@ -40,87 +49,9 @@ type R interface {
|
||||
// Keys 返回当前映射或结构体的所有键名
|
||||
Keys() []string
|
||||
|
||||
// Value 返回底层的 reflect.Value
|
||||
// Raw 返回底层的 reflect.Value
|
||||
// 用于需要直接操作反射值的场景
|
||||
Value() reflect.Value
|
||||
|
||||
// Ptr 返回指向当前值的指针
|
||||
Ptr() any
|
||||
|
||||
// Any 将当前值转换为 any 类型
|
||||
Any() any
|
||||
|
||||
// Bool 将当前值转换为 bool 类型
|
||||
Bool() bool
|
||||
|
||||
// Float64 将当前值转换为 float64 类型
|
||||
Float64() float64
|
||||
|
||||
// Float32 将当前值转换为 float32 类型
|
||||
Float32() float32
|
||||
|
||||
// Int64 将当前值转换为 int64 类型
|
||||
Int64() int64
|
||||
|
||||
// Int32 将当前值转换为 int32 类型
|
||||
Int32() int32
|
||||
|
||||
// Int16 将当前值转换为 int16 类型
|
||||
Int16() int16
|
||||
|
||||
// Int8 将当前值转换为 int8 类型
|
||||
Int8() int8
|
||||
|
||||
// Int 将当前值转换为 int 类型
|
||||
Int() int
|
||||
|
||||
// Uint 将当前值转换为 uint 类型
|
||||
Uint() uint
|
||||
|
||||
// Uint64 将当前值转换为 uint64 类型
|
||||
Uint64() uint64
|
||||
|
||||
// Uint32 将当前值转换为 uint32 类型
|
||||
Uint32() uint32
|
||||
|
||||
// Uint16 将当前值转换为 uint16 类型
|
||||
Uint16() uint16
|
||||
|
||||
// Uint8 将当前值转换为 uint8 类型
|
||||
Uint8() uint8
|
||||
|
||||
// String 将当前值转换为 string 类型
|
||||
String() string
|
||||
|
||||
// StringMapString 将当前值转换为 map[string]string 类型
|
||||
StringMapString() map[string]string
|
||||
|
||||
// StringMapStringSlice 将当前值转换为 map[string][]string 类型
|
||||
StringMapStringSlice() map[string][]string
|
||||
|
||||
// StringMapBool 将当前值转换为 map[string]bool 类型
|
||||
StringMapBool() map[string]bool
|
||||
|
||||
// StringMapInt 将当前值转换为 map[string]int 类型
|
||||
StringMapInt() map[string]int
|
||||
|
||||
// StringMapInt64 将当前值转换为 map[string]int64 类型
|
||||
StringMapInt64() map[string]int64
|
||||
|
||||
// StringMap 将当前值转换为 map[string]any 类型
|
||||
StringMap() map[string]any
|
||||
|
||||
// Slice 将当前值转换为 []any 切片
|
||||
Slice() []any
|
||||
|
||||
// BoolSlice 将当前值转换为 []bool 切片
|
||||
BoolSlice() []bool
|
||||
|
||||
// StringSlice 将当前值转换为 []string 切片
|
||||
StringSlice() []string
|
||||
|
||||
// IntSlice 将当前值转换为 []int 切片
|
||||
IntSlice() []int
|
||||
Raw() reflect.Value
|
||||
}
|
||||
|
||||
// New 创建一个新的 R 实例
|
||||
|
||||
Reference in New Issue
Block a user