Проблемы в Go с JSON unmarshal of map [string] int64 - PullRequest
0 голосов
/ 09 октября 2019

У меня проблема с JSON, не относящимся к структуре Go. Видимо, источник проблемы недостаточно стабилен - для int64 поступает строка, за исключением того, что я не нахожу способов решить ее без изменения типа данных Count для отображения строки [string]. Я видел похожие дискуссии по SO, но они не сильно помогли. Вот представительский код и вопрос. Пожалуйста, предложите, как я могу пройти.

type Product struct {
    Count  map[string]int64 `json:",string"`
}

func main() {
    s := `{"count":{"FAN":"58"}}`

    var pro Product
    err := json.Unmarshal([]byte(s), &pro)
    if err == nil {
        fmt.Printf("%+v\n", pro)
    } else {
        fmt.Println(err)
        fmt.Printf("%+v\n", pro)
    }
}

Вывод:

json: не удается разархивировать строку в поле структуры Go Product.Count типа int64 {Count: map [FAN:0]}

1 Ответ

1 голос
/ 09 октября 2019

Как вы уже заметили, это происходит потому, что вы передаете не целое число JSON 58, а строку JSON "58".

Если вы измените свой пример ввода на

s := `{"count":{"FAN":58}}`

тогда ваш код работает как положено .

Вы можете написать собственный unmarshaller, но исправить проблему, пока unmarshalling, может оказаться не тем, что вам нужно;вместо этого найдите способ изменить конвейер данных и убедиться, что объект JSON должным образом очищен. Или, если это невозможно, сделайте так, как вы предлагаете, и вместо этого используйте map[string]string, а затем исправьте типы данных после демонтажа.

...