| // 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 |
| } |