| 
									
										
										
										
											2012-03-22 18:25:40 +11:00
										 |  |  | // 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) { | 
					
						
							| 
									
										
										
										
											2016-11-09 14:49:12 -08:00
										 |  |  | 		log.Panicf("Error unmarshaling %q, expected %q, got %q", b, expected, f) | 
					
						
							| 
									
										
										
										
											2012-03-22 18:25:40 +11:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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() | 
					
						
							|  |  |  | } |