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

Golang:如何将[]字符串强制转换为类型化结构?,go,Go,对于json对象,它很简单: type MyObj struct { Prop1 int `json:"prop1"` Prop2 []string `json:"prop2"` } 如何对MyObj施放简单的[]字符串切片?我知道我可以迭代切片并通过各自的索引手动分配每个属性,但考虑到Prop1在切片的0索引处引用,以及Prop2-1,可能有更好的方法 EDIT1: 我的实际JSON字符串看起来像[100200]。因此MyObj.Prop1将分别被100和M

对于json对象,它很简单:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   []string `json:"prop2"`
}
如何对MyObj施放简单的
[]字符串
切片?我知道我可以迭代切片并通过各自的索引手动分配每个属性,但考虑到Prop1在切片的0索引处引用,以及Prop2-1,可能有更好的方法

EDIT1

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


谢谢。

如果您将json作为变量(您的字符串)中的字符串,那么您可以将其解组到[]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应该如下所示:{“prop1”:100,“prop2”:[“200”]}。因为prop1是一个int,而prop2是一个[]字符串 我认为您要么需要更改结构,要么需要更改json

例如,您可以这样定义MyObj:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   string   `json:"prop2"`
}
要匹配如下所示的json对象:

{“prop1”:100,“prop2”:“200”}

如果您希望保持MyObj的原样,那么您的json应该如下所示:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   string   `json:"prop2"`
}
{“prop1”:100,“prop2”:[“200”]}


签入go Playerd:

如果您将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应该如下所示:{“prop1”:100,“prop2”:[“200”]}。因为prop1是一个int,而prop2是一个[]字符串 我认为您要么需要更改结构,要么需要更改json

例如,您可以这样定义MyObj:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   string   `json:"prop2"`
}
要匹配如下所示的json对象:

{“prop1”:100,“prop2”:“200”}

如果您希望保持MyObj的原样,那么您的json应该如下所示:

type MyObj struct {
    Prop1   int      `json:"prop1"`
    Prop2   string   `json:"prop2"`
}
{“prop1”:100,“prop2”:[“200”]}


在围棋场登记:

您需要一个自定义的
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
}

示例:

您需要一个自定义的
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
}


示例:

您的意思是要将
[]MyObj
转换为
[]字符串
?您还可以向我们展示您的字符串的外观吗?其他方式。我有JSON
[100200]
,我想把它转换成
MyObj
,这样我就可以用
MyObj.Prop1
200
MyObj.Prop2
访问
100
。根据你定义的MyObj,你的JSON应该是这样的:{“Prop1:100,“Prop2”:[“200”}。由于prop1是一个int,而prop2是一个[]字符串,我知道如何处理这种JSON,但其中有一部分仍然是
[100200]
。你的意思是你想把
[]MyObj
转换成
[]字符串
?你能给我们看看你的字符串是什么样子吗?换一种方式。我有JSON
[100200]
,我想把它转换成
MyObj
,这样我就可以用
MyObj.Prop1
200
MyObj.Prop2
访问
100
。根据你定义的MyObj,你的JSON应该是这样的:{“Prop1:100,“Prop2”:[“200”}。由于prop1是一个int,而prop2是一个[]string,我知道如何处理这种JSON,但其中有一部分仍然是
[100200]
。谢谢。但是我明确地说,我需要将
[]字符串
转换为
MyObj
struct。我知道如何使用
[string]string
@AleksandrMakov来实现这一点,那么我相信我在围棋场上提供的例子应该是可行的。谢谢。但是我明确地说,我需要将
[]字符串
转换为
MyObj
struct。我知道如何使用
[string]string
@AleksandrMakov来实现这一点,那么我相信我在围棋场上提供的例子应该会奏效。谢谢。我知道我们仍然需要手动分配
Prop1
Prop2
。我想知道我们是否有一种自动化的方法来执行类似于
MyObj[0]=slice[0]
的操作,这意味着Prop1位于
MyObj
中的索引0处
MyObj[0]
slice[0]
是不同的类型(分别是type
MyObj
string
)。您想要的
=
操作无法完成。最好的方法是编写一次具有所需行为的自定义解组器,这样就可以避免每次json数据出现时手动分配。谢谢。我知道我们仍然需要手动分配
Prop1
Prop2
。我想知道我们是否有一种自动化的方法来执行类似于
MyObj[0]=slice[0]
的操作,这意味着Prop1位于
MyObj
中的索引0处
MyObj[0]
slice[0]
是不同的类型(分别是type
MyObj
string
)。您想要的
=
操作无法完成。最好的办法是编写一次具有所需行为的自定义解组器,这样就可以避免每次json数据出现时手动赋值。