我需要以灵活的方式指定用于解码JSON数据的类型,这意味着需要在运行时指定类型.
请考虑以下代码段:http://play.golang.org/p/F-Jy4ufMPz
s := `{"b":[{"x":9},{"x":4}]}`
var a struct {
B []interface{}
}
err := json.Unmarshal([]byte(s), &a)
if err != nil {
panic(err)
}
fmt.Println(a)
Run Code Online (Sandbox Code Playgroud)
哪个会产生{[map[x:9] map[x:4]]}.我想解码为特定(struct)类型的数组,而不是[]interface{}在编译时指定它.
如果没有预先创建阵列,这有可能吗?(退回的物品数量未知)
我现在能想到的唯一方法是稍后再次对返回的映射进行编码,并将它们解码为指定的类型,这会产生不必要的处理开销.
如果没有在编译时指定它,您仍然需要在某处指定它.
如果在检索Json数据之前指定,则可以简单地执行切换案例,将其解组为所需对象.
如果在 Json数据中指定,您可以json.RawMessage在确定适合的结构类型后,将"灵活"部分编组为a 来处理它:
package main
import (
"encoding/json"
"fmt"
)
var s = `{"type":"structx", "data":{"x":9,"xstring":"This is structX"}}`
type JsonStruct struct {
Type string
Data json.RawMessage
}
type StructX struct {
X float64
Xstring string
}
type StructY struct {
Y bool
}
func main() {
var a *JsonStruct
err := json.Unmarshal([]byte(s), &a)
if err != nil {
panic(err)
}
switch a.Type {
case "structx":
// We Unmashal the RawMessage part into a StructX
var s *StructX
json.Unmarshal([]byte(a.Data), &s)
if err != nil {
panic(err)
}
fmt.Println(s)
case "structy":
// Do the same but for structY
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
821 次 |
| 最近记录: |