2

我为我的 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”无效

4

1 回答 1

12

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

除了手动完成之外,您还可以为字符串调用 marshaller,只需将您的 return 替换为return json.Marshal(e).

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

于 2015-07-21T10:17:58.340 回答