diff --git a/CHANGELOG.md b/CHANGELOG.md index 45e736e..0f3275a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # CHANGELOG +## [v1.1.1] - 2026-05-02 +- **修复**: 解决 `FastEncoder` 在编码结构体时忽略匿名嵌入(Embedded)字段的问题,确保组合对象的完整序列化。 + ## [v1.1.0] - 2026-05-02 - **功能**: 新增 `FastEncoder`,实现单路径 JSON 编码,大幅提升性能并减少内存分配。 - **功能**: 新增 `ToJSONDesensitize` 和 `ToJSONDesensitizeBytes`,支持原生字段脱敏。 diff --git a/json_encoder.go b/json_encoder.go index bd54723..fdc6fff 100644 --- a/json_encoder.go +++ b/json_encoder.go @@ -162,8 +162,14 @@ func (encoder *fastEncoder) encodeMap(reflectValue reflect.Value, path string) e func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string) error { encoder.buffer.WriteByte('{') - reflectType := reflectValue.Type() first := true + err := encoder.encodeStructFields(reflectValue, path, &first) + encoder.buffer.WriteByte('}') + return err +} + +func (encoder *fastEncoder) encodeStructFields(reflectValue reflect.Value, path string, first *bool) error { + reflectType := reflectValue.Type() for index := 0; index < reflectType.NumField(); index++ { field := reflectType.Field(index) if !field.IsExported() { @@ -172,21 +178,25 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string // 处理匿名嵌入 if field.Anonymous { - // 这里简单处理,实际上标准库会展开。我们为了保持算法一致性,直接递归。 - // 但要注意 JSON Tag 可能会覆盖 - continue + fieldValue := reflectValue.Field(index) + if fieldValue.Kind() == reflect.Struct { + if err := encoder.encodeStructFields(fieldValue, path, first); err != nil { + return err + } + continue + } } - if !first { + if !*first { encoder.buffer.WriteByte(',') } - first = false + *first = false // 算法转换 Key keyName := field.Name tag := field.Tag.Get("json") keepKey := strings.Contains(string(field.Tag), "keepKey") - + if tag != "" && tag != "-" { parts := strings.Split(tag, ",") keyName = parts[0] @@ -209,7 +219,7 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string encoder.writeString(keyName) encoder.buffer.WriteByte(':') - + newPath := keyName if path != "" { newPath = path + "." + keyName @@ -218,7 +228,6 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string return err } } - encoder.buffer.WriteByte('}') return nil }