如何在Go中将JSON解组为接口

时间:2013-07-22 19:59:00

标签: json go

我正在尝试同时解组并从许多不同的JSON响应中删除字段到适当的Go结构中。为此,我创建了一个Wrappable接口,用于定义Unwrap方法(剥离相应的字段)并将该接口传递给解组和解包的代码。它看起来像以下示例(也在http://play.golang.org/p/fUGveHwiz9):

package main

import (
    "encoding/json"
    "fmt"
)

type Data struct {
    A string `json:"a"`
    B string `json:"b"`
}

type DataWrapper struct {
    Elements []Data `json:"elems"`
}

type Wrapper interface {
    Unwrap() []interface{}
}

func (dw DataWrapper) Unwrap() []interface{} {
    result := make([]interface{}, len(dw.Elements))
    for i := range dw.Elements {
        result[i] = dw.Elements[i]
    }
    return result
}

func unmarshalAndUnwrap(data []byte, wrapper Wrapper) []interface{} {
    err := json.Unmarshal(data, &wrapper)
    if err != nil {
        panic(err)
    }
    return wrapper.Unwrap()
}

func main() {
    data := `{"elems": [{"a": "data", "b": "data"}, {"a": "data", "b": "data"}]}`
    res := unmarshalAndUnwrap([]byte(data), DataWrapper{})
    fmt.Println(res)
}

但是,当我运行代码时,Go出现以下错误:

panic: json: cannot unmarshal object into Go value of type main.Wrapper

似乎unmarshaller不希望传递指向接口的指针。鉴于我可以使用unmarshalAndUnwrap方法中的reflect包来获取底层类型和字段,我对此感到有些惊讶。任何人都可以提供对这个问题的见解以及我如何解决它吗?

1 个答案:

答案 0 :(得分:1)

正如您所说,传递非指针失败。你为什么要这样做呢?

替换

res := unmarshalAndUnwrap([]byte(data), DataWrapper{})

通过

res := unmarshalAndUnwrap([]byte(data), &DataWrapper{})

应该这样做,避免不必要的复制。

此错误可帮助您理解:http://play.golang.org/p/jXxCxPQDOw