Golang:如何将[]字符串强制转换为类型化结构?
对于json对象,它很简单: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
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]
是不同的类型(分别是typeMyObj
和string
)。您想要的=
操作无法完成。最好的方法是编写一次具有所需行为的自定义解组器,这样就可以避免每次json数据出现时手动分配。谢谢。我知道我们仍然需要手动分配Prop1
和Prop2
。我想知道我们是否有一种自动化的方法来执行类似于MyObj[0]=slice[0]
的操作,这意味着Prop1位于MyObj
中的索引0处MyObj[0]
和slice[0]
是不同的类型(分别是typeMyObj
和string
)。您想要的=
操作无法完成。最好的办法是编写一次具有所需行为的自定义解组器,这样就可以避免每次json数据出现时手动赋值。