...
Run Format

Source file src/encoding/json/example_marshaling_test.go

Documentation: encoding/json

  // 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
  }
  

View as plain text