-
Notifications
You must be signed in to change notification settings - Fork 687
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Copy encoding/json and sigs.k8s.io/yaml into our tree
Turns out that the Go ecosystem doesn't currently offer control over the tag used when serializing or deserializing JSON or YAML. This is pretty appalling. We need control over the tag, and the most sane way I've found to support that is _copying all of encoding/json and sigs.k8s.io/yaml into our tree_ and modifying them. Ugh. Bad ecosystem! Signed-off-by: Flynn <[email protected]>
- Loading branch information
Showing
85 changed files
with
43,158 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// Copyright 2016 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 ( | ||
"encoding/json" | ||
"fmt" | ||
"log" | ||
"strings" | ||
) | ||
|
||
type Animal int | ||
|
||
const ( | ||
Unknown Animal = iota | ||
Gopher | ||
Zebra | ||
) | ||
|
||
func (a *Animal) UnmarshalJSON(b []byte) error { | ||
var s string | ||
if err := json.Unmarshal(b, &s); err != nil { | ||
return err | ||
} | ||
switch strings.ToLower(s) { | ||
default: | ||
*a = Unknown | ||
case "gopher": | ||
*a = Gopher | ||
case "zebra": | ||
*a = Zebra | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func (a Animal) MarshalJSON() ([]byte, error) { | ||
var s string | ||
switch a { | ||
default: | ||
s = "unknown" | ||
case Gopher: | ||
s = "gopher" | ||
case Zebra: | ||
s = "zebra" | ||
} | ||
|
||
return json.Marshal(s) | ||
} | ||
|
||
func Example_customMarshalJSON() { | ||
blob := `["gopher","armadillo","zebra","unknown","gopher","bee","gopher","zebra"]` | ||
var zoo []Animal | ||
if err := json.Unmarshal([]byte(blob), &zoo); err != nil { | ||
log.Fatal(err) | ||
} | ||
|
||
census := make(map[Animal]int) | ||
for _, animal := range zoo { | ||
census[animal] += 1 | ||
} | ||
|
||
fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras: %d\n* Unknown: %d\n", | ||
census[Gopher], census[Zebra], census[Unknown]) | ||
|
||
// Output: | ||
// Zoo Census: | ||
// * Gophers: 3 | ||
// * Zebras: 2 | ||
// * Unknown: 3 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,310 @@ | ||
// 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 a Decoder to decode a stream of distinct JSON values. | ||
func ExampleDecoder_Token() { | ||
const jsonStream = ` | ||
{"Message": "Hello", "Array": [1, 2, 3], "Null": null, "Number": 1.234} | ||
` | ||
dec := json.NewDecoder(strings.NewReader(jsonStream)) | ||
for { | ||
t, err := dec.Token() | ||
if err == io.EOF { | ||
break | ||
} | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
fmt.Printf("%T: %v", t, t) | ||
if dec.More() { | ||
fmt.Printf(" (more)") | ||
} | ||
fmt.Printf("\n") | ||
} | ||
// Output: | ||
// json.Delim: { (more) | ||
// string: Message (more) | ||
// string: Hello (more) | ||
// string: Array (more) | ||
// json.Delim: [ (more) | ||
// float64: 1 (more) | ||
// float64: 2 (more) | ||
// float64: 3 | ||
// json.Delim: ] (more) | ||
// string: Null (more) | ||
// <nil>: <nil> (more) | ||
// string: Number (more) | ||
// float64: 1.234 | ||
// json.Delim: } | ||
} | ||
|
||
// This example uses a Decoder to decode a streaming array of JSON objects. | ||
func ExampleDecoder_Decode_stream() { | ||
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)) | ||
|
||
// read open bracket | ||
t, err := dec.Token() | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
fmt.Printf("%T: %v\n", t, t) | ||
|
||
// while the array contains values | ||
for dec.More() { | ||
var m Message | ||
// decode an array value (Message) | ||
err := dec.Decode(&m) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
|
||
fmt.Printf("%v: %v\n", m.Name, m.Text) | ||
} | ||
|
||
// read closing bracket | ||
t, err = dec.Token() | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
fmt.Printf("%T: %v\n", t, t) | ||
|
||
// Output: | ||
// json.Delim: [ | ||
// Ed: Knock knock. | ||
// Sam: Who's there? | ||
// Ed: Go fmt. | ||
// Sam: Go fmt who? | ||
// Ed: Go fmt yourself! | ||
// json.Delim: ] | ||
} | ||
|
||
// This example uses RawMessage to delay parsing part of a JSON message. | ||
func ExampleRawMessage_unmarshal() { | ||
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 any | ||
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} | ||
} | ||
|
||
// This example uses RawMessage to use a precomputed JSON during marshal. | ||
func ExampleRawMessage_marshal() { | ||
h := json.RawMessage(`{"precomputed": true}`) | ||
|
||
c := struct { | ||
Header *json.RawMessage `json:"header"` | ||
Body string `json:"body"` | ||
}{Header: &h, Body: "Hello Gophers!"} | ||
|
||
b, err := json.MarshalIndent(&c, "", "\t") | ||
if err != nil { | ||
fmt.Println("error:", err) | ||
} | ||
os.Stdout.Write(b) | ||
|
||
// Output: | ||
// { | ||
// "header": { | ||
// "precomputed": true | ||
// }, | ||
// "body": "Hello Gophers!" | ||
// } | ||
} | ||
|
||
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 | ||
// = } | ||
// =] | ||
} | ||
|
||
func ExampleMarshalIndent() { | ||
data := map[string]int{ | ||
"a": 1, | ||
"b": 2, | ||
} | ||
|
||
b, err := json.MarshalIndent(data, "<prefix>", "<indent>") | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
|
||
fmt.Println(string(b)) | ||
// Output: | ||
// { | ||
// <prefix><indent>"a": 1, | ||
// <prefix><indent>"b": 2 | ||
// <prefix>} | ||
} | ||
|
||
func ExampleValid() { | ||
goodJSON := `{"example": 1}` | ||
badJSON := `{"example":2:]}}` | ||
|
||
fmt.Println(json.Valid([]byte(goodJSON)), json.Valid([]byte(badJSON))) | ||
// Output: | ||
// true false | ||
} | ||
|
||
func ExampleHTMLEscape() { | ||
var out bytes.Buffer | ||
json.HTMLEscape(&out, []byte(`{"Name":"<b>HTML content</b>"}`)) | ||
out.WriteTo(os.Stdout) | ||
// Output: | ||
//{"Name":"\u003cb\u003eHTML content\u003c/b\u003e"} | ||
} |
Oops, something went wrong.