从 json 解组中键入断言二维接口数组的更简单方法
Simpler way to type assert a two-dimensional interface array from json unmarshal
我需要解组一个复杂的 json 数据,其中包含一个 [][]interface{} 数组。我想使用更抽象的结构类型来解组它,但 Golang 只能将它识别为 []interface{}。
示例代码:
// I want to use this, but not work
var r1 = struct {
Data map[string]interface{}
}{}
// Works well, but too complex if data nest much
var r2 = struct {
Data struct{
P1 int64
P2 [][]interface{}
}
}{}
jsonData := []byte(`{"data" :{"p1": 0, "p2":[["1", null], ["2", null] ]}}`)
json.Unmarshal (jsonData, &r1)
_, ok := r1.Data["p2"].([][]interface{})
fmt.Println(ok)
fmt.Println("======")
_, ok = r1.Data["p2"].([]interface{})
fmt.Println(ok)
fmt.Println("======")
json.Unmarshal (jsonData, &r2)
fmt.Println(r2.Data.P2)
输出:
false
======
true
======
[[1 <nil>] [2 <nil>]]
解决方案 1:
您需要对空接口{}类型应用两次断言。
我需要解组一个复杂的 json 数据,其中包含一个 [][]interface{} 数组。我想使用更抽象的结构类型来解组它,但 Golang 只能将它识别为 []interface{}。
示例代码:
// I want to use this, but not work
var r1 = struct {
Data map[string]interface{}
}{}
// Works well, but too complex if data nest much
var r2 = struct {
Data struct{
P1 int64
P2 [][]interface{}
}
}{}
jsonData := []byte(`{"data" :{"p1": 0, "p2":[["1", null], ["2", null] ]}}`)
json.Unmarshal (jsonData, &r1)
_, ok := r1.Data["p2"].([][]interface{})
fmt.Println(ok)
fmt.Println("======")
_, ok = r1.Data["p2"].([]interface{})
fmt.Println(ok)
fmt.Println("======")
json.Unmarshal (jsonData, &r2)
fmt.Println(r2.Data.P2)
输出:
false
======
true
======
[[1 <nil>] [2 <nil>]]
解决方案 1:
您需要对空接口{}类型应用两次断言。