运行时动态结构体支持数组!!!!!!!!
This commit is contained in:
58
builder.go
58
builder.go
@ -167,10 +167,6 @@ func (b *builderImpl) addNestedField(nameArr []string, pkg string, typ any, tag
|
||||
jsonTag := nameArr[i]
|
||||
fieldName := wrapper.String(jsonTag).SnakeCaseToCamel()
|
||||
parentName := strings.Join(nameArr[:i], ".")
|
||||
if strings.HasSuffix(parentName, "."+ArraySplit) {
|
||||
// 数组部分处理
|
||||
continue
|
||||
}
|
||||
parentJsonTag := nameArr[i-1]
|
||||
parentFieldName := wrapper.String(parentJsonTag).SnakeCaseToCamel()
|
||||
fieldTag := fmt.Sprintf(`json:"%s"`, parentJsonTag)
|
||||
@ -242,31 +238,52 @@ func (b *builderImpl) Build() DynamicStruct {
|
||||
// 说明是顶层了
|
||||
b.AddField(builderCfg.Field, "", builderCfg.Builder.Build().New(), builderCfg.Tag, false)
|
||||
} else {
|
||||
loopCnt := 0
|
||||
buildInstance := builderCfg.Builder.Build()
|
||||
val := buildInstance.New()
|
||||
for {
|
||||
// (非顶层) 父级结构存在, 将其追加到父级结构中即可, 向前看一步即为父级结构
|
||||
parentName := strings.Join(parentNameArr[:len(parentNameArr)-1-loopCnt], ".")
|
||||
if strings.HasSuffix(parentName, "."+ArraySplit) {
|
||||
// 说明父级是数组
|
||||
loopCnt++
|
||||
val = reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(val)), 1, 1).Interface()
|
||||
fmt.Println(val)
|
||||
// b.nestedStructTable[parentName].Builder.AddField(builderCfg.Field, "", val, builderCfg.Tag, false)
|
||||
} else {
|
||||
// 父级非数组
|
||||
b.nestedStructTable[parentName].Builder.AddField(builderCfg.Field, "", val, builderCfg.Tag, false)
|
||||
// 处理数组
|
||||
arrDeep := 0
|
||||
newParentNameArr := []string{}
|
||||
for i := len(parentNameArr) - 1; i >= 0; i-- {
|
||||
if parentNameArr[i] != ArraySplit {
|
||||
newParentNameArr = parentNameArr[:i+1]
|
||||
break
|
||||
}
|
||||
// 删除
|
||||
delete(b.nestedStructTable, strings.Join(parentNameArr[:i+1], "."))
|
||||
arrDeep++
|
||||
}
|
||||
if arrDeep > 0 {
|
||||
// 数组嵌套数组配置
|
||||
val := reflect.ValueOf(builderCfg.Builder.Build().New()).Elem().Interface()
|
||||
for i := 0; i < arrDeep; i++ {
|
||||
val = reflect.New(reflect.SliceOf(reflect.TypeOf(val))).Interface()
|
||||
}
|
||||
// 解除指针引用
|
||||
val = reflect.ValueOf(val).Elem().Interface()
|
||||
newParamIndex := strings.Join(newParentNameArr, ".")
|
||||
isTopIndex := len(newParentNameArr) == 1
|
||||
if isTopIndex {
|
||||
// 顶层结构, 数组类型不存在还有其他属性情况, 直接追加字段, 并移除嵌套表里的定义
|
||||
b.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
delete(b.nestedStructTable, newParamIndex)
|
||||
// b.nestedStructTable[newParamIndex].Builder.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
} else {
|
||||
// 非顶层结构, 再上探一级
|
||||
b.nestedStructTable[strings.Join(newParentNameArr[:len(newParentNameArr)-1], ".")].Builder.AddField(b.nestedStructTable[newParamIndex].Field, "", val, b.nestedStructTable[newParamIndex].Tag, false)
|
||||
}
|
||||
} else {
|
||||
// 非数组
|
||||
// (非顶层) 父级结构存在, 将其追加到父级结构中即可, 向前看一步即为父级结构
|
||||
b.nestedStructTable[strings.Join(parentNameArr[:len(parentNameArr)-1], ".")].Builder.AddField(builderCfg.Field, "", builderCfg.Builder.Build().New(), builderCfg.Tag, false)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
// 一级字段属性
|
||||
var structFields []reflect.StructField
|
||||
for _, field := range b.fields {
|
||||
if strings.Contains(field.name, ArraySplit) {
|
||||
// TODO : 临时过滤, 后续需要在正确逻辑处正确移除
|
||||
continue
|
||||
}
|
||||
structFields = append(structFields, reflect.StructField{
|
||||
Name: field.name,
|
||||
PkgPath: field.pkg,
|
||||
@ -295,6 +312,7 @@ func (f *fieldConfigImpl) SetTag(tag string) FieldConfig {
|
||||
|
||||
// New 创建动态结构体实例
|
||||
func (ds *dynamicStructImpl) New() any {
|
||||
// 不要指针,全部解引用
|
||||
return reflect.New(ds.definition).Interface()
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user