Golang:如何将[]字符串转换为类型化的结构?

时间:2017-05-12 08:12:41

标签: go

使用json对象很简单:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   []string `json:"prop2"`
}

我如何针对MyObj投射简单的[]string切片?我知道我可以迭代切片并手动分配每个属性的相应索引,但考虑到Prop1引用切片的0索引和Prop2 - 1,可能有更优化的方式。

EDIT1

我的实际JSON字符串看起来像[100, 200]。因此MyObj.Prop1分别会被100MyObj.Prop2填充200

谢谢。

2 个答案:

答案 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
}

示例:https://play.golang.org/p/fVobgtrqNw

答案 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