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' в вашей ошибке происходит из-за того, что начальная часть значения обрабатывается как число, а затем возникает неожиданный символ.

Другие вопросы по тегам