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
|
# CHANGELOG
|
||||||
|
|
||||||
|
## [v1.1.1] - 2026-05-02
|
||||||
|
- **修复**: 解决 `FastEncoder` 在编码结构体时忽略匿名嵌入(Embedded)字段的问题,确保组合对象的完整序列化。
|
||||||
|
|
||||||
## [v1.1.0] - 2026-05-02
|
## [v1.1.0] - 2026-05-02
|
||||||
- **功能**: 新增 `FastEncoder`,实现单路径 JSON 编码,大幅提升性能并减少内存分配。
|
- **功能**: 新增 `FastEncoder`,实现单路径 JSON 编码,大幅提升性能并减少内存分配。
|
||||||
- **功能**: 新增 `ToJSONDesensitize` 和 `ToJSONDesensitizeBytes`,支持原生字段脱敏。
|
- **功能**: 新增 `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 {
|
func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string) error {
|
||||||
encoder.buffer.WriteByte('{')
|
encoder.buffer.WriteByte('{')
|
||||||
reflectType := reflectValue.Type()
|
|
||||||
first := true
|
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++ {
|
for index := 0; index < reflectType.NumField(); index++ {
|
||||||
field := reflectType.Field(index)
|
field := reflectType.Field(index)
|
||||||
if !field.IsExported() {
|
if !field.IsExported() {
|
||||||
@ -172,15 +178,19 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string
|
|||||||
|
|
||||||
// 处理匿名嵌入
|
// 处理匿名嵌入
|
||||||
if field.Anonymous {
|
if field.Anonymous {
|
||||||
// 这里简单处理,实际上标准库会展开。我们为了保持算法一致性,直接递归。
|
fieldValue := reflectValue.Field(index)
|
||||||
// 但要注意 JSON Tag 可能会覆盖
|
if fieldValue.Kind() == reflect.Struct {
|
||||||
|
if err := encoder.encodeStructFields(fieldValue, path, first); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if !first {
|
if !*first {
|
||||||
encoder.buffer.WriteByte(',')
|
encoder.buffer.WriteByte(',')
|
||||||
}
|
}
|
||||||
first = false
|
*first = false
|
||||||
|
|
||||||
// 算法转换 Key
|
// 算法转换 Key
|
||||||
keyName := field.Name
|
keyName := field.Name
|
||||||
@ -218,7 +228,6 @@ func (encoder *fastEncoder) encodeStruct(reflectValue reflect.Value, path string
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
encoder.buffer.WriteByte('}')
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user