codekingpro/portable-devtools
114k
1// Copyright 2011 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4 5//go:build !goexperiment.jsonv26 7package json_test8 9import (10 "bytes"11 "encoding/json"12 "fmt"13 "io"14 "log"15 "os"16 "strings"17)18 19func ExampleMarshal() {20 type ColorGroup struct {21 ID int22 Name string23 Colors []string24 }25 group := ColorGroup{26 ID: 1,27 Name: "Reds",28 Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},29 }30 b, err := json.Marshal(group)31 if err != nil {32 fmt.Println("error:", err)33 }34 os.Stdout.Write(b)35 // Output:36 // {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}37}38 39func ExampleUnmarshal() {40 var jsonBlob = []byte(`[41 {"Name": "Platypus", "Order": "Monotremata"},42 {"Name": "Quoll", "Order": "Dasyuromorphia"}43]`)44 type Animal struct {45 Name string46 Order string47 }48 var animals []Animal49 err := json.Unmarshal(jsonBlob, &animals)50 if err != nil {51 fmt.Println("error:", err)52 }53 fmt.Printf("%+v", animals)54 // Output:55 // [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]56}57 58// This example uses a Decoder to decode a stream of distinct JSON values.59func ExampleDecoder() {60 const jsonStream = `61 {"Name": "Ed", "Text": "Knock knock."}62 {"Name": "Sam", "Text": "Who's there?"}63 {"Name": "Ed", "Text": "Go fmt."}64 {"Name": "Sam", "Text": "Go fmt who?"}65 {"Name": "Ed", "Text": "Go fmt yourself!"}66`67 type Message struct {68 Name, Text string69 }70 dec := json.NewDecoder(strings.NewReader(jsonStream))71 for {72 var m Message73 if err := dec.Decode(&m); err == io.EOF {74 break75 } else if err != nil {76 log.Fatal(err)77 }78 fmt.Printf("%s: %s\n", m.Name, m.Text)79 }80 // Output:81 // Ed: Knock knock.82 // Sam: Who's there?83 // Ed: Go fmt.84 // Sam: Go fmt who?85 // Ed: Go fmt yourself!86}87 88// This example uses a Decoder to decode a stream of distinct JSON values.89func ExampleDecoder_Token() {90 const jsonStream = `91 {"Message": "Hello", "Array": [1, 2, 3], "Null": null, "Number": 1.234}92`93 dec := json.NewDecoder(strings.NewReader(jsonStream))94 for {95 t, err := dec.Token()96 if err == io.EOF {97 break98 }99 if err != nil {100 log.Fatal(err)101 }102 fmt.Printf("%T: %v", t, t)103 if dec.More() {104 fmt.Printf(" (more)")105 }106 fmt.Printf("\n")107 }108 // Output:109 // json.Delim: { (more)110 // string: Message (more)111 // string: Hello (more)112 // string: Array (more)113 // json.Delim: [ (more)114 // float64: 1 (more)115 // float64: 2 (more)116 // float64: 3117 // json.Delim: ] (more)118 // string: Null (more)119 // <nil>: <nil> (more)120 // string: Number (more)121 // float64: 1.234122 // json.Delim: }123}124 125// This example uses a Decoder to decode a streaming array of JSON objects.126func ExampleDecoder_Decode_stream() {127 const jsonStream = `128 [129 {"Name": "Ed", "Text": "Knock knock."},130 {"Name": "Sam", "Text": "Who's there?"},131 {"Name": "Ed", "Text": "Go fmt."},132 {"Name": "Sam", "Text": "Go fmt who?"},133 {"Name": "Ed", "Text": "Go fmt yourself!"}134 ]135`136 type Message struct {137 Name, Text string138 }139 dec := json.NewDecoder(strings.NewReader(jsonStream))140 141 // read open bracket142 t, err := dec.Token()143 if err != nil {144 log.Fatal(err)145 }146 fmt.Printf("%T: %v\n", t, t)147 148 // while the array contains values149 for dec.More() {150 var m Message151 // decode an array value (Message)152 err := dec.Decode(&m)153 if err != nil {154 log.Fatal(err)155 }156 157 fmt.Printf("%v: %v\n", m.Name, m.Text)158 }159 160 // read closing bracket161 t, err = dec.Token()162 if err != nil {163 log.Fatal(err)164 }165 fmt.Printf("%T: %v\n", t, t)166 167 // Output:168 // json.Delim: [169 // Ed: Knock knock.170 // Sam: Who's there?171 // Ed: Go fmt.172 // Sam: Go fmt who?173 // Ed: Go fmt yourself!174 // json.Delim: ]175}176 177// This example uses RawMessage to delay parsing part of a JSON message.178func ExampleRawMessage_unmarshal() {179 type Color struct {180 Space string181 Point json.RawMessage // delay parsing until we know the color space182 }183 type RGB struct {184 R uint8185 G uint8186 B uint8187 }188 type YCbCr struct {189 Y uint8190 Cb int8191 Cr int8192 }193 194 var j = []byte(`[195 {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}},196 {"Space": "RGB", "Point": {"R": 98, "G": 218, "B": 255}}197]`)198 var colors []Color199 err := json.Unmarshal(j, &colors)200 if err != nil {201 log.Fatalln("error:", err)202 }203 204 for _, c := range colors {205 var dst any206 switch c.Space {207 case "RGB":208 dst = new(RGB)209 case "YCbCr":210 dst = new(YCbCr)211 }212 err := json.Unmarshal(c.Point, dst)213 if err != nil {214 log.Fatalln("error:", err)215 }216 fmt.Println(c.Space, dst)217 }218 // Output:219 // YCbCr &{255 0 -10}220 // RGB &{98 218 255}221}222 223// This example uses RawMessage to use a precomputed JSON during marshal.224func ExampleRawMessage_marshal() {225 h := json.RawMessage(`{"precomputed": true}`)226 227 c := struct {228 Header *json.RawMessage `json:"header"`229 Body string `json:"body"`230 }{Header: &h, Body: "Hello Gophers!"}231 232 b, err := json.MarshalIndent(&c, "", "\t")233 if err != nil {234 fmt.Println("error:", err)235 }236 os.Stdout.Write(b)237 238 // Output:239 // {240 // "header": {241 // "precomputed": true242 // },243 // "body": "Hello Gophers!"244 // }245}246 247func ExampleIndent() {248 type Road struct {249 Name string250 Number int251 }252 roads := []Road{253 {"Diamond Fork", 29},254 {"Sheep Creek", 51},255 }256 257 b, err := json.Marshal(roads)258 if err != nil {259 log.Fatal(err)260 }261 262 var out bytes.Buffer263 json.Indent(&out, b, "=", "\t")264 out.WriteTo(os.Stdout)265 // Output:266 // [267 // = {268 // = "Name": "Diamond Fork",269 // = "Number": 29270 // = },271 // = {272 // = "Name": "Sheep Creek",273 // = "Number": 51274 // = }275 // =]276}277 278func ExampleMarshalIndent() {279 data := map[string]int{280 "a": 1,281 "b": 2,282 }283 284 b, err := json.MarshalIndent(data, "<prefix>", "<indent>")285 if err != nil {286 log.Fatal(err)287 }288 289 fmt.Println(string(b))290 // Output:291 // {292 // <prefix><indent>"a": 1,293 // <prefix><indent>"b": 2294 // <prefix>}295}296 297func ExampleValid() {298 goodJSON := `{"example": 1}`299 badJSON := `{"example":2:]}}`300 301 fmt.Println(json.Valid([]byte(goodJSON)), json.Valid([]byte(badJSON)))302 // Output:303 // true false304}305 306func ExampleHTMLEscape() {307 var out bytes.Buffer308 json.HTMLEscape(&out, []byte(`{"Name":"<b>HTML content</b>"}`))309 out.WriteTo(os.Stdout)310 // Output:311 //{"Name":"\u003cb\u003eHTML content\u003c/b\u003e"}312}313 