json转golang struct有没有好工具

如题所述

第1个回答  2017-11-07
用标准库也就二三十行的事情
package main
import (
"encoding/json"
"fmt"
"go/format"
"go/types"
"regexp"
"strings"
)
func main() {
nameSep := regexp.MustCompile(`[-_]`)
fixName := func(name string) string {
parts := nameSep.Split(name, -1)
for i, part := range parts {
parts[i] = strings.Title(part)
}
return strings.Join(parts, "")
}
var genType func(interface{}) types.Type
genType = func(v interface{}) types.Type {
if v == nil {
return types.NewInterface([]*types.Func{}, []*types.Named{})
}
switch v := v.(type) {
case float64:
return types.Typ[types.Float64]
case string:
return types.Typ[types.String]
case []interface{}:
if len(v) > 0 {
return types.NewSlice(genType(v[0]))
}
return types.NewSlice(genType(nil))
case map[string]interface{}:
var fields []*types.Var
var tags []string
for name, elem := range v {
fields = append(fields, types.NewField(0, nil, fixName(name), genType(elem), false))
tags = append(tags, `json:"`+name+`"`)
}
return types.NewStruct(fields, tags)
}
panic(fmt.Errorf("bad json value: %T\n", v))
}
j := `
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
],
"foo-bar": []
}
}}
`
var v interface{}
if err := json.Unmarshal([]byte(j), &v); err != nil {
panic(err)
}
src := `var J ` + types.TypeString(genType(v), nil)
formatted, err := format.Source([]byte(src))
if err != nil {
panic(err)
}
fmt.Printf("%s\n", formatted)
}
输出
var J struct {
Menu struct {
Id string "json:\"id\""
Value string "json:\"value\""
Popup struct {
Menuitem []struct {
Value string "json:\"value\""
Onclick string "json:\"onclick\""
} "json:\"menuitem\""
FooBar []interface{} "json:\"foo-bar\""
} "json:\"popup\""
} "json:\"menu\""
}本回答被提问者采纳
第2个回答  2021-03-30

 试试这个工具 可以在线把JSON转成golang struct

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网