diff options
Diffstat (limited to 'doc/progs/json3.go')
-rw-r--r-- | doc/progs/json3.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/doc/progs/json3.go b/doc/progs/json3.go new file mode 100644 index 000000000..a04fdfa50 --- /dev/null +++ b/doc/progs/json3.go @@ -0,0 +1,73 @@ +// Copyright 2012 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 main + +import ( + "encoding/json" + "fmt" + "log" + "reflect" +) + +func Decode() { + b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`) + + var f interface{} + err := json.Unmarshal(b, &f) + + // STOP OMIT + + if err != nil { + panic(err) + } + + expected := map[string]interface{}{ + "Name": "Wednesday", + "Age": float64(6), + "Parents": []interface{}{ + "Gomez", + "Morticia", + }, + } + + if !reflect.DeepEqual(f, expected) { + log.Panicf("Error unmarshalling %q, expected %q, got %q", b, expected, f) + } + + f = map[string]interface{}{ + "Name": "Wednesday", + "Age": 6, + "Parents": []interface{}{ + "Gomez", + "Morticia", + }, + } + + // STOP OMIT + + m := f.(map[string]interface{}) + + for k, v := range m { + switch vv := v.(type) { + case string: + fmt.Println(k, "is string", vv) + case int: + fmt.Println(k, "is int", vv) + case []interface{}: + fmt.Println(k, "is an array:") + for i, u := range vv { + fmt.Println(i, u) + } + default: + fmt.Println(k, "is of a type I don't know how to handle") + } + } + + // STOP OMIT +} + +func main() { + Decode() +} |