mirror of https://github.com/goccy/go-json.git
75 lines
1.2 KiB
Go
75 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 (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/goccy/go-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
|
||
|
}
|