2017-12-07 9 views
-3

私はjsonの型を判断したいと思っていますが、常に "型マップ[文字列]インタフェース{}についてはわかりません!"というメッセージが返されます。golangでunmarshal json interface {}型を判断するにはどうすればよいですか?

============================================== ===========================

type getRemoteCardInfo struct { 
    Code int 
    Msg string 
    Data []*remoteCardInfo 
} 
type remoteCardInfo struct { 
Sn   string 
RemoteCardIp string 
RemoteCardMac string 
} 
func Get_json_data(url string) (interface{}, error) { 
    client := &http.Client{} 
    req, err := http.NewRequest("GET", url, nil) 
    req.Header.Add("X-MYCMDB-Auth-Token", "sPf98SMBWzOZJEJB8KWltbJyKvFYPauu") 
    if err != nil { 
     return nil, err 
    } 
    resp, _ := client.Do(req) 
    if resp.StatusCode != http.StatusOK { 
    resp.Body.Close() 
    return nil, fmt.Errorf("query failed: %s", resp.Status) 
    } 
    var result interface{} 
    body, err := ioutil.ReadAll(resp.Body) 
    if err := json.Unmarshal(body, &result); err != nil { 
     log.Fatalf("JSON unmarshaling failed: %s", err) 
    } 
    resp.Body.Close() 
    fmt.Println(result) 
    return result, nil 
    } 
func main() { 
     jsondata, err := Get_json_data(DHCPURL) 
     if err != nil { 
     log.Fatal(err) 
     } 
     switch v := jsondata.(type) { 
     case getRemoteCardInfo: 
      fmt.Println("aaaa") 
     default: 
      fmt.Printf("I don't know about type %T!\n", v) 
     } 
+2

行くのツアーを見ると、それはあなたが望むものではない場合は、空のインターフェイスにマーシャリング解除を停止します。 – Volker

+0

問題を理解するために必要な部分にのみコードを整理してください。また、適切に書式設定すると、読めるようになります。 – Flimzy

+0

私は裁判官を意味するかどうか、おそらくあなたが主張を探しているのか分からない、この場合(タイプ)はあなたが主張の対象とするタイプです。こちらをご覧くださいhttps://tour.golang.org/methods/15 –

答えて

0

あなたは事実を伝えることができるようgo JSON unmarshalerが、種類について知っていませんそれはinterface{}値に結果を格納していること:

func Unmarshal(data []byte, v interface{}) error 
// "v" can be any type -------^ 

をだから、あなたの構造を移入し、結果が有効であるかどうかを決定するためにunmarshalerを使用するのはあなた次第です。

例では、HTTP応答からremoteCardInfoを非整列化しようとしているようです。これを行うには、空のremoteCardInfo構造体に非整列化し、必要なフィールドに値が設定されているかどうかを判断する必要があります。例えば

、あなたがそうのようなJSONドキュメントを期待していたとします

{ 
    "sn": "123", 
    "ip": "0.0.0.0", 
    "mac": "ff:ff:ff:ff:ff:ff" 
} 

次に、あなたが以下のように、あなたの「remoteCardInfo」構造体を定義する必要があります。

type remoteCardInfo struct { 
    Sn   string `json:"sn"` 
    RemoteCardIp string `json:"ip"` 
    RemoteCardMac string `json:"mac"` 
} 

そしてアンマーシャリングなどのようにそれを検証します:

もちろん
func getRemoteCardInfo(bs []byte) (*remoteCardInfo, error) { 
    rci := remoteCardInfo{} 
    err := json.Unmarshal(bs, &rci) 
    if err != nil { 
    return nil, err 
    } 
    // Validate the expected fields 
    if rci.Sn == "" { 
    return nil, fmt.Errorf(`missing "sn"`) 
    } 
    if rci.RemoteCardIp == "" { 
    return nil, fmt.Errorf(`missing "ip"`) 
    } 
    if rci.RemoteCardMac == "" { 
    return nil, fmt.Errorf(`missing "mac"`) 
    } 
    return &rci, nil 
} 

、あなたはフィールドにあなたが好きなようが、メイントンを検証することができます非マーシャラーは、入力バイト配列が有効なJSONドキュメントであることを保証する作業のみを行い、ドキュメントのフィールドを値で定義されたフィールドに移入するということです。

それはJSONドキュメントが何を表すかのオブジェクトの「タイプ」を伝えることはできません。

関連する問題