根据reflect包实现,解析json字符串,打印出结构体;
如json字符串:
{ "DbSettings": [{ "host": "127.0.0.1", "port": 3306, "password":"123456", "dbname":"Demo" }], "AesKey": "Here store a aes key", "tlist":["a", "b","c"] }
打印出所有结构体:
结果:
type A struct {
DbSettings []ADbSettings `json:"DbSettings"`
AesKey string `json:"AesKey"`
Tlist []string `json:"tlist"`
}
type ADbSettings struct {
Password string `json:"password"`
Dbname string `json:"dbname"`
Host string `json:"host"`
Port float64 `json:"port"`
}
// 大写首字母 func FirstToUpper(s string) string { runes := []rune(s) return strings.ToUpper(string(runes[0])) + string(runes[1:]) } // 驼峰转下划线 func humpToUnderline(s string) string { data := make([]byte, 0, len(s)*2) j := false num := len(s) for i := 0; i < num; i++ { d := s[i] // or通过ASCII码进行大小写的转化 // 65-90(A-Z),97-122(a-z) //判断如果字母为大写的A-Z就在前面拼接一个_ if i > 0 && d >= 'A' && d <= 'Z' && j { data = append(data, '_') } if d != '_' { j = true } data = append(data, d) } return strings.ToLower(string(data[:])) } // 打印结构体 func generateStruct(data interface{}, structName string) { structName = FirstToUpper(structName) v := reflect.ValueOf(data) var buffer bytes.Buffer buffer.WriteString("type ") buffer.WriteString(structName) buffer.WriteString(" struct {\n") switch v.Kind() { case reflect.Slice, reflect.Array: vslice := data.([]interface{}) if len(vslice) > 0 { switch reflect.ValueOf(vslice[0]).Kind() { case reflect.Map, reflect.Slice, reflect.Array: sname := fmt.Sprintf("%s%s", structName, "List") generateStruct(vslice[0], sname) buffer.WriteString("[]" + sname) default: buffer.WriteString("[]" + reflect.ValueOf(vslice[0]).Kind().String()) } } case reflect.Map: for k, m := range data.(map[string]interface{}) { buffer.WriteString(FirstToUpper(k)) buffer.WriteString("\t") switch reflect.ValueOf(m).Kind() { case reflect.Array, reflect.Slice: vslice := m.([]interface{}) if len(vslice) > 0 { switch reflect.ValueOf(vslice[0]).Kind() { case reflect.Map, reflect.Slice, reflect.Array: sname := fmt.Sprintf("%s%s", structName, k) generateStruct(vslice[0], sname) buffer.WriteString("[]" + sname) default: buffer.WriteString("[]" + reflect.ValueOf(vslice[0]).Kind().String()) } } case reflect.Map: vtype := fmt.Sprintf("%s%s", structName, k) generateStruct(m, vtype) buffer.WriteString(vtype) default: buffer.WriteString(reflect.ValueOf(m).Kind().String()) } buffer.WriteString("\t`json:\"") buffer.WriteString(humpToUnderline(k)) buffer.WriteString("\"`") buffer.WriteString("\n") } } buffer.WriteString("}") buffer.WriteString("\n") fmt.Println(buffer.String()) fmt.Println("\n") }
func main(){
s := `{ "DbSettings": [{ "host": "127.0.0.1", "port": 3306, "password":"123456", "dbname":"Demo" }], "AesKey": "Here store a aes key", "tlist":["a", "b","c"] } `
var rs interface{} err := json.Unmarshal([]byte(s), &rs) if err != nil{ fmt.Println(err.Error()) } generateStruct(rs, "a")
}