aboutsummaryrefslogtreecommitdiff
path: root/doc/progs/json3.go
blob: 442c155b08af4c3129d28fe9774a2c9498b362a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 unmarshaling %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()
}