| 1 |
747 |
jeremybenn |
// Copyright 2010 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 implements encoding and decoding of JSON objects as defined in
|
| 6 |
|
|
// RFC 4627.
|
| 7 |
|
|
//
|
| 8 |
|
|
// See "JSON and Go" for an introduction to this package:
|
| 9 |
|
|
// http://blog.golang.org/2011/01/json-and-go.html
|
| 10 |
|
|
package json
|
| 11 |
|
|
|
| 12 |
|
|
import (
|
| 13 |
|
|
"bytes"
|
| 14 |
|
|
"encoding/base64"
|
| 15 |
|
|
"math"
|
| 16 |
|
|
"reflect"
|
| 17 |
|
|
"runtime"
|
| 18 |
|
|
"sort"
|
| 19 |
|
|
"strconv"
|
| 20 |
|
|
"sync"
|
| 21 |
|
|
"unicode"
|
| 22 |
|
|
"unicode/utf8"
|
| 23 |
|
|
)
|
| 24 |
|
|
|
| 25 |
|
|
// Marshal returns the JSON encoding of v.
|
| 26 |
|
|
//
|
| 27 |
|
|
// Marshal traverses the value v recursively.
|
| 28 |
|
|
// If an encountered value implements the Marshaler interface
|
| 29 |
|
|
// and is not a nil pointer, Marshal calls its MarshalJSON method
|
| 30 |
|
|
// to produce JSON. The nil pointer exception is not strictly necessary
|
| 31 |
|
|
// but mimics a similar, necessary exception in the behavior of
|
| 32 |
|
|
// UnmarshalJSON.
|
| 33 |
|
|
//
|
| 34 |
|
|
// Otherwise, Marshal uses the following type-dependent default encodings:
|
| 35 |
|
|
//
|
| 36 |
|
|
// Boolean values encode as JSON booleans.
|
| 37 |
|
|
//
|
| 38 |
|
|
// Floating point and integer values encode as JSON numbers.
|
| 39 |
|
|
//
|
| 40 |
|
|
// String values encode as JSON strings, with each invalid UTF-8 sequence
|
| 41 |
|
|
// replaced by the encoding of the Unicode replacement character U+FFFD.
|
| 42 |
|
|
// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
|
| 43 |
|
|
// to keep some browsers from misinterpreting JSON output as HTML.
|
| 44 |
|
|
//
|
| 45 |
|
|
// Array and slice values encode as JSON arrays, except that
|
| 46 |
|
|
// []byte encodes as a base64-encoded string.
|
| 47 |
|
|
//
|
| 48 |
|
|
// Struct values encode as JSON objects. Each exported struct field
|
| 49 |
|
|
// becomes a member of the object unless
|
| 50 |
|
|
// - the field's tag is "-", or
|
| 51 |
|
|
// - the field is empty and its tag specifies the "omitempty" option.
|
| 52 |
|
|
// The empty values are false, 0, any
|
| 53 |
|
|
// nil pointer or interface value, and any array, slice, map, or string of
|
| 54 |
|
|
// length zero. The object's default key string is the struct field name
|
| 55 |
|
|
// but can be specified in the struct field's tag value. The "json" key in
|
| 56 |
|
|
// struct field's tag value is the key name, followed by an optional comma
|
| 57 |
|
|
// and options. Examples:
|
| 58 |
|
|
//
|
| 59 |
|
|
// // Field is ignored by this package.
|
| 60 |
|
|
// Field int `json:"-"`
|
| 61 |
|
|
//
|
| 62 |
|
|
// // Field appears in JSON as key "myName".
|
| 63 |
|
|
// Field int `json:"myName"`
|
| 64 |
|
|
//
|
| 65 |
|
|
// // Field appears in JSON as key "myName" and
|
| 66 |
|
|
// // the field is omitted from the object if its value is empty,
|
| 67 |
|
|
// // as defined above.
|
| 68 |
|
|
// Field int `json:"myName,omitempty"`
|
| 69 |
|
|
//
|
| 70 |
|
|
// // Field appears in JSON as key "Field" (the default), but
|
| 71 |
|
|
// // the field is skipped if empty.
|
| 72 |
|
|
// // Note the leading comma.
|
| 73 |
|
|
// Field int `json:",omitempty"`
|
| 74 |
|
|
//
|
| 75 |
|
|
// The "string" option signals that a field is stored as JSON inside a
|
| 76 |
|
|
// JSON-encoded string. This extra level of encoding is sometimes
|
| 77 |
|
|
// used when communicating with JavaScript programs:
|
| 78 |
|
|
//
|
| 79 |
|
|
// Int64String int64 `json:",string"`
|
| 80 |
|
|
//
|
| 81 |
|
|
// The key name will be used if it's a non-empty string consisting of
|
| 82 |
|
|
// only Unicode letters, digits, dollar signs, percent signs, hyphens,
|
| 83 |
|
|
// underscores and slashes.
|
| 84 |
|
|
//
|
| 85 |
|
|
// Map values encode as JSON objects.
|
| 86 |
|
|
// The map's key type must be string; the object keys are used directly
|
| 87 |
|
|
// as map keys.
|
| 88 |
|
|
//
|
| 89 |
|
|
// Pointer values encode as the value pointed to.
|
| 90 |
|
|
// A nil pointer encodes as the null JSON object.
|
| 91 |
|
|
//
|
| 92 |
|
|
// Interface values encode as the value contained in the interface.
|
| 93 |
|
|
// A nil interface value encodes as the null JSON object.
|
| 94 |
|
|
//
|
| 95 |
|
|
// Channel, complex, and function values cannot be encoded in JSON.
|
| 96 |
|
|
// Attempting to encode such a value causes Marshal to return
|
| 97 |
|
|
// an InvalidTypeError.
|
| 98 |
|
|
//
|
| 99 |
|
|
// JSON cannot represent cyclic data structures and Marshal does not
|
| 100 |
|
|
// handle them. Passing cyclic structures to Marshal will result in
|
| 101 |
|
|
// an infinite recursion.
|
| 102 |
|
|
//
|
| 103 |
|
|
func Marshal(v interface{}) ([]byte, error) {
|
| 104 |
|
|
e := &encodeState{}
|
| 105 |
|
|
err := e.marshal(v)
|
| 106 |
|
|
if err != nil {
|
| 107 |
|
|
return nil, err
|
| 108 |
|
|
}
|
| 109 |
|
|
return e.Bytes(), nil
|
| 110 |
|
|
}
|
| 111 |
|
|
|
| 112 |
|
|
// MarshalIndent is like Marshal but applies Indent to format the output.
|
| 113 |
|
|
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
|
| 114 |
|
|
b, err := Marshal(v)
|
| 115 |
|
|
if err != nil {
|
| 116 |
|
|
return nil, err
|
| 117 |
|
|
}
|
| 118 |
|
|
var buf bytes.Buffer
|
| 119 |
|
|
err = Indent(&buf, b, prefix, indent)
|
| 120 |
|
|
if err != nil {
|
| 121 |
|
|
return nil, err
|
| 122 |
|
|
}
|
| 123 |
|
|
return buf.Bytes(), nil
|
| 124 |
|
|
}
|
| 125 |
|
|
|
| 126 |
|
|
// MarshalForHTML is like Marshal but applies HTMLEscape to the output.
|
| 127 |
|
|
func MarshalForHTML(v interface{}) ([]byte, error) {
|
| 128 |
|
|
b, err := Marshal(v)
|
| 129 |
|
|
if err != nil {
|
| 130 |
|
|
return nil, err
|
| 131 |
|
|
}
|
| 132 |
|
|
var buf bytes.Buffer
|
| 133 |
|
|
HTMLEscape(&buf, b)
|
| 134 |
|
|
return buf.Bytes(), nil
|
| 135 |
|
|
}
|
| 136 |
|
|
|
| 137 |
|
|
// HTMLEscape appends to dst the JSON-encoded src with <, >, and &
|
| 138 |
|
|
// characters inside string literals changed to \u003c, \u003e, \u0026
|
| 139 |
|
|
// so that the JSON will be safe to embed inside HTML
© copyright 1999-2025
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.
|