рдЬрд╛рдУ: рдЧрд▓рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдпрд╛ рдПрдкреАрдЖрдИ рдбреЗрд╡рд▓рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ

рдЫрд╡рд┐

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдЧреЛ рдкрд░ рдПрдХ http рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреА, рдЬреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ json рдХреЗ рд╕рд╛рде REST API рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдПрдХ рдорд╛рдирдХ рдХрд╛рд░реНрдп, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд┐рдВрджреБ рдХреНрдпрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, json рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдЪрд╛рд░ рдЖрджрд┐рдо: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛, рдмреВрд▓рд┐рдпрди, рдЕрд╢рдХреНрдд; рдФрд░ рджреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░: рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдПрдХ рд╕рд░рдгреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг json рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

{
	"name":"qwerty",
	"price":258.25,
	"active":true,
	"description":null,
}

рдЬреИрд╕рд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдиреНрдпреВрдореЗрд░рд┐рдХ - рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдирд╣реАрдВ рд╣реИред рдПрдХ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рд╣реА рдпрд╛ рдЧрд▓рдд (рдмрд┐рдирд╛ рдЙрджреНрдзрд░рдг рдХреЗ)ред рдФрд░ рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рддрджрдиреБрд╕рд╛рд░ рд╢реВрдиреНрдп (рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛ рднреА) рд╣реИред

рдФрд░ рдЕрдм рд╕рдорд╕реНрдпрд╛ рдЦреБрджред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдЬреМрди рдХреЛрдб рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЦреЗрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдЗрд╕реЗ рдореВрд▓реНрдп рдХрд╣рддреЗ рд╣реИрдВ) рд╕рдордп-рд╕рдордп рдкрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореВрд▓реНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди (рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛) рд╣реИред рдпрд╣реА рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдпрд╣ рдЙрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред рдореИрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рджреВрд╕рд░реЗ рдЫреЛрд░ рдкрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрддреА рд╣реИ, рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрд╕рди рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛ред рдлрд┐рд░ рднреА, рдЬреЛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд▓реЗрдХрд┐рди рддрдм рдореИрдВ рдФрд░ рднреА рд╣реИрд░рд╛рди рдерд╛ред рддрд╛рд░реНрдХрд┐рдХ рдХреНрд╖реЗрддреНрд░ (рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд╣рддреЗ рд╣реИрдВ), рд╕рдЪреНрдЪреЗ рдФрд░ рдЭреВрдареЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ "рд╕рд╣реА", "рдЧрд▓рдд" рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ 1 рдФрд░ 0 (рд╕рд╣реА рдФрд░ рдЧрд▓рдд, рдХреНрд░рдорд╢рдГ) рд▓реМрдЯрд╛рдпрд╛ред

рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд╕рдм рднреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП PHP рдореЗрдВ json рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рдкрд╛рд╕ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИ, рдФрд░ deserialized рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдПрдХ рдРрд╕реЗ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рд╕рдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдбреАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВред

рдЪрд▓рд┐рдП рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ json рдХреЛрдб рд╣реИ:

[
	{"id":1,"price":2.58},
	{"id":2,"price":7.15}
]

рдпрд╣реА рд╣реИ, json рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред рдЧреЛ рдкрд░ рдЗрд╕ рдЬреЛрдВрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

type Target struct {
	Id    int     `json:"id"`
	Price float64 `json:"price"`
}

func main() {
	jsonString := `[{"id":1,"price":2.58},
					{"id":4,"price":7.15}]`

	targets := []Target{}

	err := json.Unmarshal([]byte(jsonString), &targets)
	if err != nil {
		fmt.Println(err)
		return
	}

	for _, t := range targets {
		fmt.Println(t.Id, "-", t.Price)
	}
}

рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╣рдо рдЖрдИрдбреА рдлреАрд▓реНрдб рдХреЛ int рдФрд░ рдкреНрд░рд╛рдЗрд╕ рдлреАрд▓реНрдб рдХреЛ float64 рдореЗрдВ рджреЗ рджреЗрдВрдЧреЗред рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ json рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

[
	{"id":1,"price":2.58},
	{"id":2,"price":"2.58"},
	{"id":3,"price":7.15},
	{"id":4,"price":"7.15"}
]

рдЕрд░реНрдерд╛рддреН, рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЗ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЛ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рди рддреЛ рдлреНрд▓реЛрдЯ64 рдФрд░ рди рд╣реА рдХреЛрдИ рдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ, рдлреНрд▓реЛрдЯ64 рдХреЗ рдПрдХрд▓ рдлреНрд▓реЛрдЯ64 рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдордлреНрд▓реЛрдд 64 рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред

type CustomFloat64 struct{
	Float64 float64
}

рдФрд░ рд▓рдХреНрд╖реНрдп рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ:

type Target struct {
	Id    int           `json:"id"`
	Price CustomFloat64 `json:"price"`
}

рдЕрдм рдЖрдкрдХреЛ CustomFloat64 рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

"рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдЬреЛрдВрд╕ " рдкреИрдХреЗрдЬ рдХреЗ рджреЛ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╣реИрдВ: рдорд╛рд░реНрд╢рд▓рдЬрдиреНрд╕ рдФрд░ рдЕрдирдорд░рд╢рд╛рд▓рдЬрд╕рди , рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рддрд░реНрдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдордирдорд╛рдиреА рдкреНрд░рдХрд╛рд░ CustomFloat64 рдХреЗ рд▓рд┐рдП рдЕрдирдорд░рд╢рд╛рд▓рд╕рди рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

func (cf *CustomFloat64) UnmarshalJSON(data []byte) error {

рдЗрдирдкреБрдЯ рдкрд░, рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╛рдЗрдЯреНрд╕ (рдбреЗрдЯрд╛) рдХрд╛ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рд▓реЗрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдХреЛрдбреНрдб рдЬрд╕рди рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЗрд╕ рдХреНрд░рдо рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдореВрд▓реНрдп рдареАрдХ рдЙрд╕реА рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ json рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рд╣рдо рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг ("258") рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрдЦреЗрдВрдЧреЗ, рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рд╣рдо рдмрд┐рдирд╛ рдЙрджреНрдзрд░рдг (258) рдХреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрдЦреЗрдВрдЧреЗред

рдХрд┐рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕реЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХ рдорд╛рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╣рд▓рд╛ рд╡рд░реНрдг рдПрдХ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЪреВрдВрдХрд┐ UNICODE рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рд╡рд░реНрдг рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреЛ UNICODE рдореЗрдВ рд╡рд░реНрдг рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 34 рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЪрд░рд┐рддреНрд░ рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХ рд░реВрдг (рд░реВрдг) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реНрдерд┐рддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

if data[0] == 34 {

рдпрджрд┐ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрддреА рд╣реИ, рддреЛ рдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЙрджреНрдзрд░рдг рдХреЗ рдмреАрдЪ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдкрд╣рд▓реЗ рдФрд░ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЗ рдмреАрдЪ рдЯреБрдХрдбрд╝рд╛ рдмрд╛рдЗрдЯред рдЗрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо json.Unmarshal рдкрджреНрдзрддрд┐ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ CustomFloat64 рд╕рдВрд░рдЪрдирд╛ рдХреЗ Float64 рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

err := json.Unmarshal(data[1:len(data)-1], &cf.Float64)

рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реНрд▓рд╛рдЗрд╕ рдПрдХ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╕реАрдзреЗ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП json.Unmarshal рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

err := json.Unmarshal(data, &cf.Float64)

рдпрд╣рд╛рдБ рдЕрдирдорд░рд╢рд▓рдЬрди рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

func (cf *CustomFloat64) UnmarshalJSON(data []byte) error {
	if data[0] == 34 {
		err := json.Unmarshal(data[1:len(data)-1], &cf.Float64)
		if err != nil {
			return errors.New("CustomFloat64: UnmarshalJSON: " + err.Error())
		}
	} else {
		err := json.Unmarshal(data, &cf.Float64)
		if err != nil {
			return errors.New("CustomFloat64: UnmarshalJSON: " + err.Error())
		}
	}
	return nil
}

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ json рдХреЛрдб рдореЗрдВ json.Unmarshal рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рднреА рдореВрд▓реНрдп рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдкрд░рд┐рдгрд╛рдо CustomFloat64 рд╕рдВрд░рдЪрдирд╛ рдХреЗ Float64 рдлрд╝реАрд▓реНрдб рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рд╣рдореЗрдВ рдЯрд╛рд░рдЧреЗрдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╡рд╛рдкрд╕ рдЬреЕрд╕рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рд╣рдо json.Marshal рдкрджреНрдзрддрд┐ рдХреЛ рд╕реАрдзреЗ CustomFloat64 рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдореЗрдВ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ CustomFloat64 рдХреЗ рдХреЛрдбрд┐рдВрдЧ рддрд░реНрдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрд╢реЗрд▓рдЬреЛрди рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рддреЗ рд╣реИрдВ:

func (cf CustomFloat64) MarshalJSON() ([]byte, error) {
	json, err := json.Marshal(cf.Float64)
	return json, err
}

рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрдкрдХреЛ рдмрд╕ рдлрд┐рд░ рд╕реЗ json.Marshal рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ CustomFloat64 рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ Float64 рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╡рд┐рдзрд┐ рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рдЯреБрдХрдбрд╝рд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдкреВрд░реНрдг рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдбреАрд░рд┐рдПрд░рд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИ, рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░рдВрддрд░ рд╣реИ):

package main

import (
	"encoding/json"
	"errors"
	"fmt"
)

type CustomFloat64 struct {
	Float64 float64
}

const QUOTES_BYTE = 34

func (cf *CustomFloat64) UnmarshalJSON(data []byte) error {
	if data[0] == QUOTES_BYTE {
		err := json.Unmarshal(data[1:len(data)-1], &cf.Float64)
		if err != nil {
			return errors.New("CustomFloat64: UnmarshalJSON: " + err.Error())
		}
	} else {
		err := json.Unmarshal(data, &cf.Float64)
		if err != nil {
			return errors.New("CustomFloat64: UnmarshalJSON: " + err.Error())
		}
	}
	return nil
}

func (cf CustomFloat64) MarshalJSON() ([]byte, error) {
	json, err := json.Marshal(cf.Float64)
	return json, err
}

type Target struct {
	Id    int           `json:"id"`
	Price CustomFloat64 `json:"price"`
}

func main() {
	jsonString := `[{"id":1,"price":2.58},
					{"id":2,"price":"2.58"},
					{"id":3,"price":7.15},
					{"id":4,"price":"7.15"}]`

	targets := []Target{}

	_ := json.Unmarshal([]byte(jsonString), &targets)

	for _, t := range targets {
		fmt.Println(t.Id, "-", t.Price.Float64)
	}

	jsonStringNew, _ := json.Marshal(targets)
	fmt.Println(string(jsonStringNew))
}

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:

1 - 2.58
2 - 2.58
3 - 7.15
4 - 7.15
[{"id":1,"price":2.58},{"id":2,"price":2.58},{"id":3,"price":7.15},{"id":4,"price":7.15}]

рдЖрдЗрдП рджреВрд╕рд░реЗ рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрд╕рдВрдЧрдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдВрд╕ рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ json рдХреЛрдб рд╣реИ:

[
	{"id":1,"active":true},
	{"id":2,"active":"true"},
	{"id":3,"active":"1"},
	{"id":4,"active":1},
	{"id":5,"active":false},
	{"id":6,"active":"false"},
	{"id":7,"active":"0"},
	{"id":8,"active":0},
	{"id":9,"active":""}
]

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреЗрд╡рд▓ рджреЛ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрд░реНрде рд╣реИ: рд╕рдЪреНрдЪрд╛ рдФрд░ рдЧрд▓рддред рдЧреИрд░-рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЛ deserialization рдХреЗ рджреМрд░рд╛рди рдмреВрд▓рд┐рдпрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореИрдЪреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╕рдЪреНрдЪреЗ рдореВрд▓реНрдп рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ: рд╕рдЪреНрдЪрд╛ (рддрд╛рд░реНрдХрд┐рдХ), рд╕рдЪреНрдЪрд╛ (рд╕реНрдЯреНрд░рд┐рдВрдЧ), 1 (рд╕реНрдЯреНрд░рд┐рдВрдЧ), 1 (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ)ред рдЕрд╕рддреНрдп рдорд╛рди рд╕рдВрдЧрдд рд╣реИ: рдЕрд╕рддреНрдп (рддрд╛рд░реНрдХрд┐рдХ), рдЕрд╕рддреНрдп (рд╕реНрдЯреНрд░рд┐рдВрдЧ), 0 (рд╕реНрдЯреНрд░рд┐рдВрдЧ), 0 (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ), "" (рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ)ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдбреАрд░рд┐рдПрд░рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред рд╕рдХреНрд░рд┐рдп рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ CustomBool:

type Target struct {
	Id     int        `json:"id"`
	Active CustomBool `json:"active"`
}

CustomBool рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреВрд▓ рдлрд╝реАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИ:

type CustomBool struct {
	Bool bool
}

рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдирдорд░рд╢рд▓рдЬрди рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдХреЛрдб рджреВрдВрдЧрд╛:

func (cb *CustomBool) UnmarshalJSON(data []byte) error {
	switch string(data) {
	case `"true"`, `true`, `"1"`, `1`:
		cb.Bool = true
		return nil
	case `"false"`, `false`, `"0"`, `0`, `""`:
		cb.Bool = false
		return nil
	default:
		return errors.New("CustomBool: parsing \"" + string(data) + "\": unknown value")
	}
}

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрд╡рд┐рдЪ-рдХреЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╕реНрдЯрдордмреБрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмреВрд▓ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореВрд▓реНрдп рдХрд┐рд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреЛ рдХреЗрд╕ рдмреНрд▓реЙрдХ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ, рд╣рдо рд╕рдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - рдЧрд▓рддред

рд╕рдВрднрд╡ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрдЬрд░реА рдХреА рднреВрдорд┐рдХрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдИ рдХреЗ рд╕рд╛рде рдХреБрдВрдЬреА рдкрд░ рдПрдХ рдРрд╕рд╛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рд╣реИ)ред рдпрд╣ рдЪрд░рд┐рддреНрд░ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, `рдЧрд▓рдд` рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ (рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛, json рдореЗрдВ рдЯрд╛рдЗрдк рдмреВрд▓), рдФрд░` рдЕрд╕рддреНрдп 'рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдЕрд╕рддреНрдп" (рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде, рдЯрд╛рдЗрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ json) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред `1` рдФрд░` 1 'рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рддред рдкрд╣рд▓рд╛ рдирдВрдмрд░ 1 рд╣реИ (рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛ json рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ), рджреВрд╕рд░рд╛ рд╣реИ рд╕реНрдЯреНрд░рд┐рдВрдЧ "1" (рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП json рдореЗрдВ)ред рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ `` "` рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЕрд░реНрдерд╛рддреН, json рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: ""ред

рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рди (рд╕рд╣реА рдпрд╛ рдЧрд▓рдд) рдХреЛ рд╕реАрдзреЗ CustomBool рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмреВрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:

cb.Bool = true

рдбрд┐рдлреЙрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ, рд╣рдо рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЕрдЬреНрдЮрд╛рдд рдорд╛рди рд╣реИ:

return errors.New("CustomBool: parsing \"" + string(data) + "\": unknown value")

рдЕрдм рд╣рдо рдЕрдкрдиреЗ json рдХреЛрдб рдореЗрдВ json.Unmarshal рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдХреНрд░рд┐рдп рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдмреВрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо CustomBool рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП MarshalJSON рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

func (cb CustomBool) MarshalJSON() ([]byte, error) {
	json, err := json.Marshal(cb.Bool)
	return json, err
}

рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдзрд┐ CustomBool рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмреВрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдкреВрд░реНрдг рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдбреАрд░рд┐рдПрд░рд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреА рдЧрдИ рд╣реИ):

package main

import (
	"encoding/json"
	"errors"
	"fmt"
)

type CustomBool struct {
	Bool bool
}

func (cb *CustomBool) UnmarshalJSON(data []byte) error {
	switch string(data) {
	case `"true"`, `true`, `"1"`, `1`:
		cb.Bool = true
		return nil
	case `"false"`, `false`, `"0"`, `0`, `""`:
		cb.Bool = false
		return nil
	default:
		return errors.New("CustomBool: parsing \"" + string(data) + "\": unknown value")
	}
}

func (cb CustomBool) MarshalJSON() ([]byte, error) {
	json, err := json.Marshal(cb.Bool)
	return json, err
}

type Target struct {
	Id     int        `json:"id"`
	Active CustomBool `json:"active"`
}

func main() {
	jsonString := `[{"id":1,"active":true},
					{"id":2,"active":"true"},
					{"id":3,"active":"1"},
					{"id":4,"active":1},
					{"id":5,"active":false},
					{"id":6,"active":"false"},
					{"id":7,"active":"0"},
					{"id":8,"active":0},
					{"id":9,"active":""}]`

	targets := []Target{}

	_ = json.Unmarshal([]byte(jsonString), &targets)

	for _, t := range targets {
		fmt.Println(t.Id, "-", t.Active.Bool)
	}

	jsonStringNew, _ := json.Marshal(targets)
	fmt.Println(string(jsonStringNew))
}

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:

1 - true
2 - true
3 - true
4 - true
5 - false
6 - false
7 - false
8 - false
9 - false
[{"id":1,"active":true},{"id":2,"active":true},{"id":3,"active":true},{"id":4,"active":true},{"id":5,"active":false},{"id":6,"active":false},{"id":7,"active":false},{"id":8,"active":false},{"id":9,"active":false}]

рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


рдкрд╣рд▓реЗ рддреЛред рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрд╢рд▓реЛрдВрдЬрди рдФрд░ рдЕрдирдорд░рд╢рд╛рд▓рдЬреЛрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬреЛрдВрд╕ рдХреЛрдб рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рдбреАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреЗрддрд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╢рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реА рдмрд╛рддред рдЬреЛрдВрд╕ рдЯреЗрдХреНрд╕реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг рд╣реИ, рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдПрдХ рд▓рд╛рдн рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реИред рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

All Articles