|  | // Copyright 2016 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package json_test | 
|  |  | 
|  | import ( | 
|  | "encoding/json" | 
|  | "fmt" | 
|  | "log" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | type Animal int | 
|  |  | 
|  | const ( | 
|  | Unknown Animal = iota | 
|  | Gopher | 
|  | Zebra | 
|  | ) | 
|  |  | 
|  | func (a *Animal) UnmarshalJSON(b []byte) error { | 
|  | var s string | 
|  | if err := json.Unmarshal(b, &s); err != nil { | 
|  | return err | 
|  | } | 
|  | switch strings.ToLower(s) { | 
|  | default: | 
|  | *a = Unknown | 
|  | case "gopher": | 
|  | *a = Gopher | 
|  | case "zebra": | 
|  | *a = Zebra | 
|  | } | 
|  |  | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func (a Animal) MarshalJSON() ([]byte, error) { | 
|  | var s string | 
|  | switch a { | 
|  | default: | 
|  | s = "unknown" | 
|  | case Gopher: | 
|  | s = "gopher" | 
|  | case Zebra: | 
|  | s = "zebra" | 
|  | } | 
|  |  | 
|  | return json.Marshal(s) | 
|  | } | 
|  |  | 
|  | func Example_customMarshalJSON() { | 
|  | blob := `["gopher","armadillo","zebra","unknown","gopher","bee","gopher","zebra"]` | 
|  | var zoo []Animal | 
|  | if err := json.Unmarshal([]byte(blob), &zoo); err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  |  | 
|  | census := make(map[Animal]int) | 
|  | for _, animal := range zoo { | 
|  | census[animal] += 1 | 
|  | } | 
|  |  | 
|  | fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras:  %d\n* Unknown: %d\n", | 
|  | census[Gopher], census[Zebra], census[Unknown]) | 
|  |  | 
|  | // Output: | 
|  | // Zoo Census: | 
|  | // * Gophers: 3 | 
|  | // * Zebras:  2 | 
|  | // * Unknown: 3 | 
|  | } |