#go
# #Вперед
Вопрос:
У меня проблема с json, когда я разархивирую [] байты в структуру после неправильного преобразования «Id»
Идентификатор: 1606146401088049402 => 1606146401088049400
`{"status":200,"success":true,"data":{"id":1606146401088049402,"created_at":"2020-11-23T22:46:41.092 07:00","updated_at":"2020-11-23T22:46:41.092 07:00","role":[{"code":"admin","name":"admin"}],"userName":"","phone":"0385666301","email":"congnguyen008@gmail.com","name":"","gender":"","title":"","firstName":"Nguyên","lastName":"Nguyễn","fullName":"Nguyên Nguyễn","displayName":"Nguyên Nguyễn","company":"","department":"","photo":"0385666301","addresses":"","phoneNumber":"","active":true,"lastTimeLogin":"2020-12-23T09:27:30.72 07:00","logged":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDg2OTQwNTAsImlkIjoiMTYwNjE0NjQwMTA4ODA0OTQwMiIsIm5hbWUiOiJOZ3V5w6puIE5ndXnhu4VuIiwicm9sZSI6W3siY29kZSI6ImFkbWluIiwibmFtZSI6ImFkbWluIn1dfQ.Spj_wWPxRrs2tYYhCmNCWaZVWVack74k9ab1FpeQsf8","time_login":"2020-12-23 09:27:30.720385 0700 07 m= 56.589410521","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDkyOTUyNTAsImlkIjoiMTYwNjE0NjQwMTA4ODA0OTQwMiIsIm5hbWUiOiJOZ3V5w6puIE5ndXnhu4VuIiwicm9sZSI6W3siY29kZSI6ImFkbWluIiwibmFtZSI6ImFkbWluIn1dfQ.mO08BTq9SUns7OPCOrDeUbZojYkw3tjUaMeIQ_e2e2U"}}}`
Код
https://play.golang.org/p/MKmkLGPfwFa
func main() {
jsonData := `{"status":200,"success":true,"data":{"id":1606146401088049402}}`
response := Response{}
err := json.Unmarshal([]byte(jsonData), amp;response)
if err != nil {
panic(err)
}
user := User{}
userJson, _ := json.Marshal(response.Data)
json.Unmarshal(userJson, amp;user)
fmt.Println(user.Id)
fmt.Printf("%T", user.Id)
}
type User struct {
Id int64 `json:"id" gorm:"primarykey"`
UserName string `json:"userName"`
}
type Response struct {
Status int `json:"status"`
Success bool `json:"success"`
Data interface{} `json:"data,omitempty"`
Message string `json:"message,omitempty"`
Input interface{} `json:"input,omitempty"`
Error error `json:"error,omitempty"`
Paging interface{} `json:"paging,omitempty"`
}
Ответ №1:
Если вы хотите отложить обработку json.. Вместо использования интерфейса, маршала, а затем разархивирования, вы могли бы использовать json.RawMessage
, например:
https://play.golang.org/p/LR1OXWpk_sF
Это устраняет Marshal
проблемы с операцией и неправильным преобразованием типов.
Ответ №2:
Чтобы разархивировать JSON в значение интерфейса, Unmarshal сохраняет одно из них в значении интерфейса: float64 для чисел JSON
тип float64 приводит к ошибочному разархивированию.
https://golang.org/pkg/encoding/json/#Unmarshal
type Response struct {
Status int `json:"status"`
Success bool `json:"success"`
Data Datam `json:"data,omitempty"`
Message string `json:"message,omitempty"`
Input interface{} `json:"input,omitempty"`
Error error `json:"error,omitempty"`
Paging interface{} `json:"paging,omitempty"`
}
type Datam struct{
Id int64 `json:"id"`
}
правильно разархивирует заданный идентификатор.