如何将JSON解组到Go中的接口中

如何将JSON解组到Go中的接口中,json,go,Json,Go,我正试图同时从大量不同的JSON响应中解组并将字段剥离到适当的Go结构中。为此,我创建了一个可包装的接口,它定义了展开方法(剥离适当的字段),并将该接口传递给解组和展开的代码。它看起来像下面的示例(也位于): 但是,当我运行代码时,Go对以下错误感到恐慌: panic: json: cannot unmarshal object into Go value of type main.Wrapper 似乎解组器不希望被传递一个指向接口的指针。我对此有些惊讶,因为我可以在unmarshalAndU

我正试图同时从大量不同的JSON响应中解组并将字段剥离到适当的Go结构中。为此,我创建了一个可包装的接口,它定义了展开方法(剥离适当的字段),并将该接口传递给解组和展开的代码。它看起来像下面的示例(也位于):

但是,当我运行代码时,Go对以下错误感到恐慌:

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

似乎解组器不希望被传递一个指向接口的指针。我对此有些惊讶,因为我可以在unmarshalAndUnwrap方法中使用reflect包获得底层类型和字段。任何人都能深入了解这个问题以及我如何解决它吗?

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

替换

res:=unmarshalAndUnwrap([]字节(数据),数据包装{})

res:=unmarshalAndUnwrap([]字节(数据),&DataWrapper{})

它应该做到这一点,避免不必要的复制


这个错误应该可以帮助您理解:

最终,我就是这么做的。由于示例代码中没有出现的其他原因,不传递指针更有意义,但将其更改为指针确实有效。JSON解组器无法对接口值进行操作,这仍然困扰着我,因为底层的具体类型可以通过reflect包(由JSON包使用)获得。这也帮助了我。我认为这是因为,如果在接口中存储一个非指针对象(如DataWrapper{}),那么“reflect”或type断言只能获取原始非指针对象的一个重复对象,因此无法为原始对象赋值。但是,如果在其中保存指针(如&DataWrapper{}),golang将能够找到正确的内存地址并最终更新这些值。
panic: json: cannot unmarshal object into Go value of type main.Wrapper