74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
// 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
|
|
}
|