MarshalJSON错误,顶级后无效字符“g”

时间:2015-07-21 09:50:07

标签: json go marshalling hashids

我为我的ID制作了自定义类型:

type ID uint

func (id ID) MarshalJSON() ([]byte, error) {
    e, _ := HashIDs.Encode([]int{int(id)})
    fmt.Println(e) /// 34gj
    return []byte(e), nil
}

func (id *ID) Scan(value interface{}) error {
    *id = ID(value.(int64))
    return nil
}

我使用HashIDs包对我的id进行编码,以便用户无法在客户端读取它们。但是我收到了这个错误:

  

json:为类型types.ID调用MarshalJSON时出错:顶级值后无效字符'g'

1 个答案:

答案 0 :(得分:8)

34gj不是有效的JSON,因此不是您的ID的有效字符串表示形式。您可能希望用双引号将其换行以表明这是一个字符串,即返回"34gj"

尝试:

func (id ID) MarshalJSON() ([]byte, error) {
    e, _ := HashIDs.Encode([]int{int(id)})
    fmt.Println(e) /// 34gj
    return []byte(`"` + e + `"`), nil
}

http://play.golang.org/p/0ESimzPbAx

您可以通过简单地用return json.Marshal(e)替换回报,而不是手动执行,也可以为字符串调用marshaller。

我的猜测是错误中的invalid character 'g'是由于值的初始部分被视为数字然后出现意外字符。