не удалось получить карту json.marshal с нестроковыми ключами

#json #go

#json #Вперед

Вопрос:

Я хочу преобразовать a map[int]string в json , поэтому я подумал json.Marshal() , что это сработает, но не удается указать неподдерживаемый тип map[int]string . Но тогда как, если я использую строку map с ключом, она работает нормально.

http://play.golang.org/p/qhlS9Nt8qQ

Позже при проверке кода маршаллера выполняется явная проверка, чтобы убедиться, что ключ не является строковым и возвращает UnsupportedTypeError

Почему я даже не могу использовать примитивы в качестве ключей? Если стандарт json не разрешает нестроковые ключи, не json.Marshal следует преобразовывать примитивы в строку и использовать их в качестве ключей?

Комментарии:

1. В документах пакета указано следующее: «Значения карты кодируются как объекты JSON. Тип ключа карты должен быть строковым; ключи объекта используются непосредственно как ключи карты «. golang.org/pkg/encoding/json/#Marshal

Ответ №1:

Это не из-за Go, а из-за Json: Json не поддерживает ничего, кроме строк для ключей.

Взгляните на грамматику Json:

 pair
    string : value
string
    ""
    " chars "
  

Полная грамматика доступна на веб-сайте Json.

К сожалению, чтобы использовать целые числа в качестве ключей, вы должны предварительно преобразовать их в строку, например, используя strconv.Itoa : выполнение этой работы не зависит от json пакета.

Комментарии:

1. Похоже, что более новые версии go поддерживают нестроковые ключи. «Значения карты кодируются как объекты JSON. Тип ключа карты должен быть либо строковым, либо целочисленным типом, либо реализовывать кодировку. TextMarshaler.»