如何在golang中判断unmarshal json interface {}类型?

时间:2017-12-07 10:44:24

标签: go

我想判断json类型,但它总是返回“我不知道类型map [string] interface {}!”,如何解决它。

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

rotateCard(){
        var $card = $("#USE ID NOT THIS FOR SELECTOR").closest('.card-container');
        console.log($card);
        if($card.hasClass('hover')){
            $card.removeClass('hover');
        } else {
            $card.addClass('hover');
        }
    }

1 个答案:

答案 0 :(得分: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
}

当然,您可以按照自己喜欢的方式验证字段,但要记住的主要事情是,unmarshaler只能确保输入字节数组是有效的JSON文档,并将文档中的字段填充到由值定义的字段。

它无法告诉您JSON文档所代表的对象的“类型”。