git.lukeshu.com/go/lowmemjson@v0.3.9-0.20230723050957-72f6d13f6fb2/compat/json/borrowed_example_marshaling_test.go (about) 1 // Copyright 2016 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 // SPDX-License-Identifier: BSD-3-Clause 6 7 package json_test 8 9 import ( 10 "fmt" 11 "log" 12 "strings" 13 14 "git.lukeshu.com/go/lowmemjson/compat/json" 15 ) 16 17 type Animal int 18 19 const ( 20 Unknown Animal = iota 21 Gopher 22 Zebra 23 ) 24 25 func (a *Animal) UnmarshalJSON(b []byte) error { 26 var s string 27 if err := json.Unmarshal(b, &s); err != nil { 28 return err 29 } 30 switch strings.ToLower(s) { 31 default: 32 *a = Unknown 33 case "gopher": 34 *a = Gopher 35 case "zebra": 36 *a = Zebra 37 } 38 39 return nil 40 } 41 42 func (a Animal) MarshalJSON() ([]byte, error) { 43 var s string 44 switch a { 45 default: 46 s = "unknown" 47 case Gopher: 48 s = "gopher" 49 case Zebra: 50 s = "zebra" 51 } 52 53 return json.Marshal(s) 54 } 55 56 func Example_customMarshalJSON() { 57 blob := `["gopher","armadillo","zebra","unknown","gopher","bee","gopher","zebra"]` 58 var zoo []Animal 59 if err := json.Unmarshal([]byte(blob), &zoo); err != nil { 60 log.Fatal(err) 61 } 62 63 census := make(map[Animal]int) 64 for _, animal := range zoo { 65 census[animal] += 1 66 } 67 68 fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras: %d\n* Unknown: %d\n", 69 census[Gopher], census[Zebra], census[Unknown]) 70 71 // Output: 72 // Zoo Census: 73 // * Gophers: 3 74 // * Zebras: 2 75 // * Unknown: 3 76 }