|  | // Copyright 2018 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 Size int | 
|  |  | 
|  | const ( | 
|  | Unrecognized Size = iota | 
|  | Small | 
|  | Large | 
|  | ) | 
|  |  | 
|  | func (s *Size) UnmarshalText(text []byte) error { | 
|  | switch strings.ToLower(string(text)) { | 
|  | default: | 
|  | *s = Unrecognized | 
|  | case "small": | 
|  | *s = Small | 
|  | case "large": | 
|  | *s = Large | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func (s Size) MarshalText() ([]byte, error) { | 
|  | var name string | 
|  | switch s { | 
|  | default: | 
|  | name = "unrecognized" | 
|  | case Small: | 
|  | name = "small" | 
|  | case Large: | 
|  | name = "large" | 
|  | } | 
|  | return []byte(name), nil | 
|  | } | 
|  |  | 
|  | func Example_textMarshalJSON() { | 
|  | blob := `["small","regular","large","unrecognized","small","normal","small","large"]` | 
|  | var inventory []Size | 
|  | if err := json.Unmarshal([]byte(blob), &inventory); err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  |  | 
|  | counts := make(map[Size]int) | 
|  | for _, size := range inventory { | 
|  | counts[size] += 1 | 
|  | } | 
|  |  | 
|  | fmt.Printf("Inventory Counts:\n* Small:        %d\n* Large:        %d\n* Unrecognized: %d\n", | 
|  | counts[Small], counts[Large], counts[Unrecognized]) | 
|  |  | 
|  | // Output: | 
|  | // Inventory Counts: | 
|  | // * Small:        3 | 
|  | // * Large:        2 | 
|  | // * Unrecognized: 3 | 
|  | } |