MarshalJSON ошибка, недопустимый символ "g" после верхнего уровня
Я сделал собственный тип для своих идентификаторов:
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
}
Я использую пакет HashID для кодирования своих идентификаторов, чтобы пользователь не мог прочитать их на стороне клиента. Но я получаю эту ошибку:
json: ошибка при вызове MarshalJSON для типов типов.ID: недопустимый символ 'g' после значения верхнего уровня
1 ответ
34gj
не является допустимым JSON и, следовательно, не является допустимым строковым представлением вашего идентификатора. Вы, вероятно, хотите заключить это в двойные кавычки, чтобы указать, что это строка, т.е. "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)
,
Я думаю, что invalid character 'g'
в вашей ошибке происходит из-за того, что начальная часть значения обрабатывается как число, а затем возникает неожиданный символ.