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

Ema*_*emi 1 json marshalling go 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

tom*_*asz 9

34gj不是有效的JSON,因此不是您的ID的有效字符串表示形式.你可能想用双引号包装它来表明这是一个字符串,即返回"34gj".

尝试:

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

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

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

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

  • Emad,它不能用```自动包装它,因为通过实现marshaller你应该提供一个有效的原始JSON.所以你可以,例如,返回`{"id":"abc"}`(不是字符串!).显然用引号包装它是错误的.你总是可以在代码中使用`return json.Marshal(e)`来提供有效的字符串表示而不用担心引号(在我的答案中添加了这条评论). (2认同)