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