簡體   English   中英

如何在Go中將JSON解組到接口

[英]How to Unmarshal JSON into an interface in 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)
}

但是,當我運行代碼時,出現以下錯誤導致出現緊急情況:

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

似乎解組器不想傳遞給接口的指針。 鑒於我可以使用unmarshalAndUnwrap方法中的reflect包了解底層類型和字段,因此對此我感到有些驚訝。 誰能提供對此問題的見解以及我如何解決該問題?

如您所述,傳遞非指針失敗。 您為何仍要嘗試這樣做?

更換

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

通過

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

它可以解決問題,避免不必要的復制。

此錯誤應該可以幫助您了解: http : //play.golang.org/p/jXxCxPQDOw

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM