github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/encoding/json/example_text_marshaling_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package json_test 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "log" 11 "strings" 12 ) 13 14 type Size int 15 16 const ( 17 Unrecognized Size = iota 18 Small 19 Large 20 ) 21 22 func (s *Size) UnmarshalText(text []byte) error { 23 switch strings.ToLower(string(text)) { 24 default: 25 *s = Unrecognized 26 case "small": 27 *s = Small 28 case "large": 29 *s = Large 30 } 31 return nil 32 } 33 34 func (s Size) MarshalText() ([]byte, error) { 35 var name string 36 switch s { 37 default: 38 name = "unrecognized" 39 case Small: 40 name = "small" 41 case Large: 42 name = "large" 43 } 44 return []byte(name), nil 45 } 46 47 func Example_textMarshalJSON() { 48 blob := `["small","regular","large","unrecognized","small","normal","small","large"]` 49 var inventory []Size 50 if err := json.Unmarshal([]byte(blob), &inventory); err != nil { 51 log.Fatal(err) 52 } 53 54 counts := make(map[Size]int) 55 for _, size := range inventory { 56 counts[size] += 1 57 } 58 59 fmt.Printf("Inventory Counts:\n* Small: %d\n* Large: %d\n* Unrecognized: %d\n", 60 counts[Small], counts[Large], counts[Unrecognized]) 61 62 // Output: 63 // Inventory Counts: 64 // * Small: 3 65 // * Large: 2 66 // * Unrecognized: 3 67 }