运行时动态结构体支持数组!!!!!!!! #2
							
								
								
									
										25
									
								
								builder.go
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								builder.go
									
									
									
									
									
								
							| @ -167,6 +167,10 @@ 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) | ||||
| @ -238,8 +242,25 @@ func (b *builderImpl) Build() DynamicStruct { | ||||
| 				// 说明是顶层了 | ||||
| 				b.AddField(builderCfg.Field, "", builderCfg.Builder.Build().New(), builderCfg.Tag, false) | ||||
| 			} else { | ||||
| 				// (非顶层) 父级结构存在, 将其追加到父级结构中即可, 向前看一步即为父级结构 | ||||
| 				b.nestedStructTable[strings.Join(parentNameArr[:len(parentNameArr)-1], ".")].Builder.AddField(builderCfg.Field, "", builderCfg.Builder.Build().New(), builderCfg.Tag, false) | ||||
| 				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) | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -14,23 +14,24 @@ import ( | ||||
| ) | ||||
|  | ||||
| func Test_dynamicStructImpl_New(t *testing.T) { | ||||
| 	instance := NewStruct(). | ||||
| 	instance := NewStruct(map[string]string{}). | ||||
| 		/*AddField("Integer", "", 0, `json:"int"`, false). | ||||
| 		AddField("Text", "", "", `json:"someText"`, false). | ||||
| 		AddField("Float", "", 0.0, `json:"double"`, false). | ||||
| 		AddField("Boolean", "", false, "", false). | ||||
| 		AddField("Slice", "", []int{}, "", false). | ||||
| 		AddField("Anonymous", "", "", `json:"-"`, false).*/ | ||||
| 		AddField("user.base.age", "", 20, `json:"age"`, false). | ||||
| 		AddField("user.base.name", "", "", `json:"name"`, false). | ||||
| 		AddField("user.job.address", "", "", `json:"address"`, false). | ||||
| 		AddField("user.job.company.name", "", "", `json:"name"`, false). | ||||
| 		AddField("user.[].base.age", "", 20, `json:"age"`, false). | ||||
| 		AddField("user.[].base.name", "", "", `json:"name"`, false). | ||||
| 		AddField("user.[].job.address", "", "", `json:"address"`, false). | ||||
| 		AddField("user.[].job.company.name", "", "", `json:"name"`, false). | ||||
| 		Build() | ||||
|  | ||||
| 	val := instance.New() | ||||
|  | ||||
| 	testByte, _ := json.Marshal(val) | ||||
| 	fmt.Println(string(testByte)) | ||||
| 	data := []byte(` | ||||
| { | ||||
| {"user": [{ | ||||
|     "int": 123, | ||||
|     "someText": "example", | ||||
|     "double": 123.45, | ||||
| @ -38,7 +39,7 @@ func Test_dynamicStructImpl_New(t *testing.T) { | ||||
|     "Slice": [1, 2, 3], | ||||
|     "user": {"job":{"address":"beijing","company":{"name":"unknown"}}, "base":{"age": 1800, "name":"baicha"}}, | ||||
|     "Anonymous": "avoid to read" | ||||
| } | ||||
| }]} | ||||
| `) | ||||
| 	err := json.Unmarshal(data, &val) | ||||
| 	fmt.Println(err, val) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user