]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: example on MarshalJSON, UnmarshalJSON
authorEmmanuel Odeke <emm.odeke@gmail.com>
Thu, 22 Sep 2016 06:11:28 +0000 (23:11 -0700)
committerAndrew Gerrand <adg@golang.org>
Thu, 3 Nov 2016 20:18:52 +0000 (20:18 +0000)
Updates #16360.

Change-Id: I5bf13d3367e68c5d8435f6ef2161d5a74cc747a7
Reviewed-on: https://go-review.googlesource.com/29611
Reviewed-by: Andrew Gerrand <adg@golang.org>
Run-TryBot: Andrew Gerrand <adg@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/encoding/json/example_marshaling_test.go [new file with mode: 0644]

diff --git a/src/encoding/json/example_marshaling_test.go b/src/encoding/json/example_marshaling_test.go
new file mode 100644 (file)
index 0000000..7f15c74
--- /dev/null
@@ -0,0 +1,73 @@
+// 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
+}