Skip to content

Commit 1080522

Browse files
committed
initial commit adding slice for object fallback
0 parents  commit 1080522

24 files changed

+12917
-0
lines changed

bench_test.go

+410
Large diffs are not rendered by default.

decode.go

+1,322
Large diffs are not rendered by default.

decode.test

+1,330
Large diffs are not rendered by default.

decode.test2

+1,321
Large diffs are not rendered by default.

decode_test.go

+2,574
Large diffs are not rendered by default.

encode.go

+1,419
Large diffs are not rendered by default.

encode_test.go

+1,203
Large diffs are not rendered by default.

example_marshaling_test.go

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright 2016 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package json_test
6+
7+
import (
8+
"encoding/json"
9+
"fmt"
10+
"log"
11+
"strings"
12+
)
13+
14+
type Animal int
15+
16+
const (
17+
Unknown Animal = iota
18+
Gopher
19+
Zebra
20+
)
21+
22+
func (a *Animal) UnmarshalJSON(b []byte) error {
23+
var s string
24+
if err := json.Unmarshal(b, &s); err != nil {
25+
return err
26+
}
27+
switch strings.ToLower(s) {
28+
default:
29+
*a = Unknown
30+
case "gopher":
31+
*a = Gopher
32+
case "zebra":
33+
*a = Zebra
34+
}
35+
36+
return nil
37+
}
38+
39+
func (a Animal) MarshalJSON() ([]byte, error) {
40+
var s string
41+
switch a {
42+
default:
43+
s = "unknown"
44+
case Gopher:
45+
s = "gopher"
46+
case Zebra:
47+
s = "zebra"
48+
}
49+
50+
return json.Marshal(s)
51+
}
52+
53+
func Example_customMarshalJSON() {
54+
blob := `["gopher","armadillo","zebra","unknown","gopher","bee","gopher","zebra"]`
55+
var zoo []Animal
56+
if err := json.Unmarshal([]byte(blob), &zoo); err != nil {
57+
log.Fatal(err)
58+
}
59+
60+
census := make(map[Animal]int)
61+
for _, animal := range zoo {
62+
census[animal] += 1
63+
}
64+
65+
fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras: %d\n* Unknown: %d\n",
66+
census[Gopher], census[Zebra], census[Unknown])
67+
68+
// Output:
69+
// Zoo Census:
70+
// * Gophers: 3
71+
// * Zebras: 2
72+
// * Unknown: 3
73+
}

example_test.go

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

0 commit comments

Comments
 (0)