fix: support anonymous embedded fields in JSON encoder [v1.1.1]

This commit is contained in:
AI Engineer 2026-05-02 23:39:10 +08:00
parent cb458129fb
commit 35014d50cb
2 changed files with 21 additions and 9 deletions

View File

@ -1,5 +1,8 @@
# CHANGELOG
## [v1.1.1] - 2026-05-02
- **修复**: 解决 `FastEncoder` 在编码结构体时忽略匿名嵌入Embedded字段的问题确保组合对象的完整序列化。
## [v1.1.0] - 2026-05-02
- **功能**: 新增 `FastEncoder`,实现单路径 JSON 编码,大幅提升性能并减少内存分配。
- **功能**: 新增 `ToJSONDesensitize``ToJSONDesensitizeBytes`,支持原生字段脱敏。

View File

@ -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
}