fix: support anonymous embedded fields in JSON encoder [v1.1.1]
This commit is contained in:
parent
cb458129fb
commit
35014d50cb
@ -1,5 +1,8 @@
|
||||
# CHANGELOG
|
||||
|
||||
## [v1.1.1] - 2026-05-02
|
||||
- **修复**: 解决 `FastEncoder` 在编码结构体时忽略匿名嵌入(Embedded)字段的问题,确保组合对象的完整序列化。
|
||||
|
||||
## [v1.1.0] - 2026-05-02
|
||||
- **功能**: 新增 `FastEncoder`,实现单路径 JSON 编码,大幅提升性能并减少内存分配。
|
||||
- **功能**: 新增 `ToJSONDesensitize` 和 `ToJSONDesensitizeBytes`,支持原生字段脱敏。
|
||||
|
||||
@ -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,15 +178,19 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string
|
||||
|
||||
// 处理匿名嵌入
|
||||
if field.Anonymous {
|
||||
// 这里简单处理,实际上标准库会展开。我们为了保持算法一致性,直接递归。
|
||||
// 但要注意 JSON Tag 可能会覆盖
|
||||
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
|
||||
@ -218,7 +228,6 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string
|
||||
return err
|
||||
}
|
||||
}
|
||||
encoder.buffer.WriteByte('}')
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user