我试图反序列化一个接口类型的数据。因此,我需要将接口类型转换为[]byte
并传递给反序列化函数。
err := json.Unmarshal([]byte(kpi), &a)
=>失败- 尝试使用以下方法将接口类型转换为
[]byte
kpidata, res := kpi.([]byte)
=>失败,kpidata
是nil
那么有没有办法可以进行转换呢?
我试图反序列化一个接口类型的数据。因此,我需要将接口类型转换为[]byte
并传递给反序列化函数。
err := json.Unmarshal([]byte(kpi), &a)
=>失败[]byte
kpidata, res := kpi.([]byte)
=>失败,kpidata
是nil
那么有没有办法可以进行转换呢?
data
应该是JSON编码的(简单来说就是字符串),因此你使用 Unmarshal
的方式是错误的。
// Unmarshal parses the JSON-encoded data and stores the result
// in the value pointed to by v. If v is nil or not a pointer,
// Unmarshal returns an InvalidUnmarshalError.
func Unmarshal(data []byte, v interface{}) error
在Go Playground上试一试,以及this: []string{"art", "football"}
:
package main
import (
"encoding/json"
"fmt"
)
func main() {
// ********************* Marshal *********************
u := map[string]interface{}{}
u["name"] = "kish"
u["age"] = 28
u["work"] = "engine"
//u["hobbies"] = []string{"art", "football"}
u["hobbies"] = "art"
b, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Println(string(b))
// ********************* Unmarshal *********************
var a interface{}
err = json.Unmarshal(b, &a)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println(a)
}
输出:
{"age":28,"hobbies":"art","name":"kish","work":"engine"}
map[name:kish work:engine age:28 hobbies:art]
您想要进行反序列化,因此请尝试这个简单的工作示例([]byte(kpi.(string))
):
package main
import (
"encoding/json"
"fmt"
)
func main() {
var kpi interface{} = st
var a []Animal
err := json.Unmarshal([]byte(kpi.(string)), &a)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println(a)
}
type Animal struct {
Name string
Order string
}
var st = `[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`
输出:
[{Platypus Monotremata} {Quoll Dasyuromorphia}]
使用([]byte(*kpi.(*string))
)的工作示例:
package main
import (
"encoding/json"
"fmt"
)
func main() {
var kpi interface{} = &st
var a []Animal
err := json.Unmarshal([]byte(*kpi.(*string)), &a)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println(a)
}
type Animal struct {
Name string
Order string
}
var st = `[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`
package main
import (
"encoding/json"
"fmt"
)
func main() {
u := map[string]interface{}{}
u["1"] = "one"
b, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
输出:
{"1":"one"}
map[string]interface {}
类型的数据需要进行编组(Marshal)?请注意:反编组(Unmarshal)需要将string
的[]byte
作为输入,而不是map[string]interface {}
。因此,为了更好地帮助您,请提供最少量的The Go Playground示例代码。 - wasmup
Person
的结构体类型,该类型包含了两个字段:Name
和Age
。在main
函数中,创建了一个新的Person
实例并将其打印到控制台。 - matthias krull[]byte(fmt.Sprint(data)
// 这里的data是interface{}类型。 - Eric