| // Copyright 2011 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 ( |
| "bytes" |
| "encoding/json" |
| "fmt" |
| "io" |
| "log" |
| "os" |
| "strings" |
| ) |
| |
| func ExampleMarshal() { |
| type ColorGroup struct { |
| ID int |
| Name string |
| Colors []string |
| } |
| group := ColorGroup{ |
| ID: 1, |
| Name: "Reds", |
| Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, |
| } |
| b, err := json.Marshal(group) |
| if err != nil { |
| fmt.Println("error:", err) |
| } |
| os.Stdout.Write(b) |
| // Output: |
| // {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]} |
| } |
| |
| func ExampleUnmarshal() { |
| var jsonBlob = []byte(`[ |
| {"Name": "Platypus", "Order": "Monotremata"}, |
| {"Name": "Quoll", "Order": "Dasyuromorphia"} |
| ]`) |
| type Animal struct { |
| Name string |
| Order string |
| } |
| var animals []Animal |
| err := json.Unmarshal(jsonBlob, &animals) |
| if err != nil { |
| fmt.Println("error:", err) |
| } |
| fmt.Printf("%+v", animals) |
| // Output: |
| // [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}] |
| } |
| |
| // This example uses a Decoder to decode a stream of distinct JSON values. |
| func ExampleDecoder() { |
| const jsonStream = ` |
| {"Name": "Ed", "Text": "Knock knock."} |
| {"Name": "Sam", "Text": "Who's there?"} |
| {"Name": "Ed", "Text": "Go fmt."} |
| {"Name": "Sam", "Text": "Go fmt who?"} |
| {"Name": "Ed", "Text": "Go fmt yourself!"} |
| ` |
| type Message struct { |
| Name, Text string |
| } |
| dec := json.NewDecoder(strings.NewReader(jsonStream)) |
| for { |
| var m Message |
| if err := dec.Decode(&m); err == io.EOF { |
| break |
| } else if err != nil { |
| log.Fatal(err) |
| } |
| fmt.Printf("%s: %s\n", m.Name, m.Text) |
| } |
| // Output: |
| // Ed: Knock knock. |
| // Sam: Who's there? |
| // Ed: Go fmt. |
| // Sam: Go fmt who? |
| // Ed: Go fmt yourself! |
| } |
| |
| // This example uses RawMessage to delay parsing part of a JSON message. |
| func ExampleRawMessage() { |
| type Color struct { |
| Space string |
| Point json.RawMessage // delay parsing until we know the color space |
| } |
| type RGB struct { |
| R uint8 |
| G uint8 |
| B uint8 |
| } |
| type YCbCr struct { |
| Y uint8 |
| Cb int8 |
| Cr int8 |
| } |
| |
| var j = []byte(`[ |
| {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}, |
| {"Space": "RGB", "Point": {"R": 98, "G": 218, "B": 255}} |
| ]`) |
| var colors []Color |
| err := json.Unmarshal(j, &colors) |
| if err != nil { |
| log.Fatalln("error:", err) |
| } |
| |
| for _, c := range colors { |
| var dst interface{} |
| switch c.Space { |
| case "RGB": |
| dst = new(RGB) |
| case "YCbCr": |
| dst = new(YCbCr) |
| } |
| err := json.Unmarshal(c.Point, dst) |
| if err != nil { |
| log.Fatalln("error:", err) |
| } |
| fmt.Println(c.Space, dst) |
| } |
| // Output: |
| // YCbCr &{255 0 -10} |
| // RGB &{98 218 255} |
| } |
| |
| func ExampleIndent() { |
| type Road struct { |
| Name string |
| Number int |
| } |
| roads := []Road{ |
| {"Diamond Fork", 29}, |
| {"Sheep Creek", 51}, |
| } |
| |
| b, err := json.Marshal(roads) |
| if err != nil { |
| log.Fatal(err) |
| } |
| |
| var out bytes.Buffer |
| json.Indent(&out, b, "=", "\t") |
| out.WriteTo(os.Stdout) |
| // Output: |
| // [ |
| // = { |
| // = "Name": "Diamond Fork", |
| // = "Number": 29 |
| // = }, |
| // = { |
| // = "Name": "Sheep Creek", |
| // = "Number": 51 |
| // = } |
| // =] |
| } |