| // 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. | |
| //go:build goexperiment.jsonv2 | |
| package json_test | |
| import ( | |
| "fmt" | |
| "log" | |
| "strings" | |
| "encoding/json" | |
| ) | |
| 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 | |
| } | |