使用json对象很简单:
type MyObj struct {
Prop1 int `json:"prop1"`
Prop2 []string `json:"prop2"`
}
我如何针对MyObj投射简单的[]string
切片?我知道我可以迭代切片并手动分配每个属性的相应索引,但考虑到Prop1引用切片的0索引和Prop2 - 1,可能有更优化的方式。
EDIT1 :
我的实际JSON字符串看起来像[100, 200]
。因此MyObj.Prop1
分别会被100
和MyObj.Prop2
填充200
。
谢谢。
答案 0 :(得分:2)
您需要自定义json.Umnarshaller
:
type MyObj struct {
Prop1 int `json:"prop1"`
Prop2 int `json:"prop2"`
}
func (a *MyObj) UnmarshalJSON(b []byte) error {
s := []string{}
if err := json.Unmarshal(b, &s); err != nil {
return err
}
l := len(s)
// Check slice bounds and errors!!
a.Prop1, _ = strconv.Atoi(s[0])
a.Prop2, _ = strconv.Atoi(s[l-1])
return nil
}
答案 1 :(得分:1)
鉴于您将json作为变量(yourString)中的字符串,那么您可以将其解组为[] MyObj
yourString := `{"prop1":"100","prop2":"200"}`
var myObj MyObj
err := json.Unmarshal([]byte(yourString), &myObj)
if err == nil {
fmt.Printf("%+v\n", myObj)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", myObj)
}
或者你可以使用json.decode执行此操作:
yourString := `{"a" : ["prop1":100,"prop2":["200"]}`
var myObj MyObj
err := json.NewDecoder(strings.NewReader(yourString)).Decode(&myObj)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(myObj.Prop1)
fmt.Println(myObj.Prop2)
<强>更新强>
根据您定义的MyObj,您的json应如下所示:{&#34; prop1&#34;:100,&#34; prop2&#34;:[&#34; 200&#34;]}。由于prop1是int,prop2是[]字符串 我想你需要改变你的结构或改变你的json。
例如,您可以像这样定义MyObj:
type MyObj struct {
Prop1 int `json:"prop1"`
Prop2 string `json:"prop2"`
}
匹配像这样的json对象:
{&#34; PROP1&#34;:100,&#34; PROP2&#34;:&#34; 200&#34;}
如果你想保持MyObj,那么你的json应该是这样的:
{&#34; PROP1&#34;:100,&#34; PROP2&#34;:[&#34; 200&#34;]}
在go操场上办理登机手续:https://play.golang.org/p/yMpeBbjhkt