876 lines
40 KiB
Go
876 lines
40 KiB
Go
// Copyright 2025 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.
|
|
|
|
// Code generated by alias_gen.go; DO NOT EDIT.
|
|
|
|
//go:build goexperiment.jsonv2 && go1.25
|
|
|
|
// Package json implements encoding and decoding of JSON as defined in
|
|
// RFC 7159. The mapping between JSON and Go values is described
|
|
// in the documentation for the Marshal and Unmarshal functions.
|
|
//
|
|
// See [JSON and Go] for an introduction to this package.
|
|
//
|
|
// # Security Considerations
|
|
//
|
|
// See the "Security Considerations" section in [encoding/json/v2].
|
|
//
|
|
// For historical reasons, the default behavior of v1 [encoding/json]
|
|
// unfortunately operates with less secure defaults.
|
|
// New usages of JSON in Go are encouraged to use [encoding/json/v2] instead.
|
|
//
|
|
// [JSON and Go]: https://go.dev/blog/json
|
|
// Migrating to v2
|
|
//
|
|
// This package (i.e., [encoding/json]) is now formally known as the v1 package
|
|
// since a v2 package now exists at [encoding/json/v2].
|
|
// All the behavior of the v1 package is implemented in terms of
|
|
// the v2 package with the appropriate set of options specified that
|
|
// preserve the historical behavior of v1.
|
|
//
|
|
// The [jsonv2.Marshal] function is the newer equivalent of v1 [Marshal].
|
|
// The [jsonv2.Unmarshal] function is the newer equivalent of v1 [Unmarshal].
|
|
// The v2 functions have the same calling signature as the v1 equivalent
|
|
// except that they take in variadic [Options] arguments that can be specified
|
|
// to alter the behavior of marshal or unmarshal. Both v1 and v2 generally
|
|
// behave in similar ways, but there are some notable differences.
|
|
//
|
|
// The following is a list of differences between v1 and v2:
|
|
//
|
|
// - In v1, JSON object members are unmarshaled into a Go struct using a
|
|
// case-insensitive name match with the JSON name of the fields.
|
|
// In contrast, v2 matches fields using an exact, case-sensitive match.
|
|
// The [jsonv2.MatchCaseInsensitiveNames] and [MatchCaseSensitiveDelimiter]
|
|
// options control this behavior difference. To explicitly specify a Go struct
|
|
// field to use a particular name matching scheme, either the `case:ignore`
|
|
// or the `case:strict` field option can be specified.
|
|
// Field-specified options take precedence over caller-specified options.
|
|
//
|
|
// - In v1, when marshaling a Go struct, a field marked as `omitempty`
|
|
// is omitted if the field value is an "empty" Go value, which is defined as
|
|
// false, 0, a nil pointer, a nil interface value, and
|
|
// any empty array, slice, map, or string. In contrast, v2 redefines
|
|
// `omitempty` to omit a field if it encodes as an "empty" JSON value,
|
|
// which is defined as a JSON null, or an empty JSON string, object, or array.
|
|
// The [OmitEmptyWithLegacySemantics] option controls this behavior difference.
|
|
// Note that `omitempty` behaves identically in both v1 and v2 for a
|
|
// Go array, slice, map, or string (assuming no user-defined MarshalJSON method
|
|
// overrides the default representation). Existing usages of `omitempty` on a
|
|
// Go bool, number, pointer, or interface value should migrate to specifying
|
|
// `omitzero` instead (which is identically supported in both v1 and v2).
|
|
//
|
|
// - In v1, a Go struct field marked as `string` can be used to quote a
|
|
// Go string, bool, number, or pointer to such as a JSON string.
|
|
// In contrast, v2 restricts the `string` option to only quote a value
|
|
// that would normally be represented as a JSON number,
|
|
// but also expands support for it to operate with any Go type
|
|
// that would normally be represented as a JSON number.
|
|
// The [StringifyWithLegacySemantics] option controls this behavior difference.
|
|
//
|
|
// - In v1, a nil Go slice or Go map is marshaled as a JSON null.
|
|
// In contrast, v2 marshals a nil Go slice or Go map as
|
|
// an empty JSON array or JSON object, respectively.
|
|
// The [jsonv2.FormatNilSliceAsNull] and [jsonv2.FormatNilMapAsNull] options
|
|
// control this behavior difference.
|
|
//
|
|
// - In v1, a Go array may be unmarshaled from a JSON array of any length.
|
|
// In contrast, in v2 a Go array must be unmarshaled from a JSON array
|
|
// of the same length, otherwise it results in an error.
|
|
// The [UnmarshalArrayFromAnyLength] option controls this behavior difference.
|
|
//
|
|
// - In v1, a Go byte array is represented as a JSON array of JSON numbers.
|
|
// In contrast, in v2 a Go byte array is represented as a Base64-encoded JSON string.
|
|
// The [FormatByteArrayAsArray] option controls this behavior difference.
|
|
//
|
|
// - In v1, MarshalJSON methods declared on a pointer receiver are only called
|
|
// if the Go value is addressable. In contrast, in v2 a MarshalJSON method
|
|
// is always callable regardless of addressability.
|
|
// The [CallMethodsWithLegacySemantics] option controls this behavior difference.
|
|
//
|
|
// - In v1, MarshalJSON and UnmarshalJSON methods are never called for Go map keys.
|
|
// In contrast, in v2 a MarshalJSON or UnmarshalJSON method is eligible for
|
|
// being called for Go map keys.
|
|
// The [CallMethodsWithLegacySemantics] option controls this behavior difference.
|
|
//
|
|
// - In v1, a Go map is marshaled in a deterministic order.
|
|
// In contrast, in v2 a Go map is marshaled in a non-deterministic order.
|
|
// The [jsonv2.Deterministic] option controls this behavior difference.
|
|
//
|
|
// - In v1, JSON strings are encoded with HTML-specific or JavaScript-specific
|
|
// characters being escaped. In contrast, in v2 JSON strings use the minimal
|
|
// encoding and only escape if required by the JSON grammar.
|
|
// The [jsontext.EscapeForHTML] and [jsontext.EscapeForJS] options
|
|
// control this behavior difference.
|
|
//
|
|
// - In v1, bytes of invalid UTF-8 within a string are silently replaced with
|
|
// the Unicode replacement character. In contrast, in v2 the presence of
|
|
// invalid UTF-8 results in an error. The [jsontext.AllowInvalidUTF8] option
|
|
// controls this behavior difference.
|
|
//
|
|
// - In v1, a JSON object with duplicate names is permitted.
|
|
// In contrast, in v2 a JSON object with duplicate names results in an error.
|
|
// The [jsontext.AllowDuplicateNames] option controls this behavior difference.
|
|
//
|
|
// - In v1, when unmarshaling a JSON null into a non-empty Go value it will
|
|
// inconsistently either zero out the value or do nothing.
|
|
// In contrast, in v2 unmarshaling a JSON null will consistently and always
|
|
// zero out the underlying Go value. The [MergeWithLegacySemantics] option
|
|
// controls this behavior difference.
|
|
//
|
|
// - In v1, when unmarshaling a JSON value into a non-zero Go value,
|
|
// it merges into the original Go value for array elements, slice elements,
|
|
// struct fields (but not map values),
|
|
// pointer values, and interface values (only if a non-nil pointer).
|
|
// In contrast, in v2 unmarshal merges into the Go value
|
|
// for struct fields, map values, pointer values, and interface values.
|
|
// In general, the v2 semantic merges when unmarshaling a JSON object,
|
|
// otherwise it replaces the value. The [MergeWithLegacySemantics] option
|
|
// controls this behavior difference.
|
|
//
|
|
// - In v1, a [time.Duration] is represented as a JSON number containing
|
|
// the decimal number of nanoseconds. In contrast, in v2 a [time.Duration]
|
|
// has no default representation and results in a runtime error.
|
|
// The [FormatDurationAsNano] option controls this behavior difference.
|
|
//
|
|
// - In v1, errors are never reported at runtime for Go struct types
|
|
// that have some form of structural error (e.g., a malformed tag option).
|
|
// In contrast, v2 reports a runtime error for Go types that are invalid
|
|
// as they relate to JSON serialization. For example, a Go struct
|
|
// with only unexported fields cannot be serialized.
|
|
// The [ReportErrorsWithLegacySemantics] option controls this behavior difference.
|
|
//
|
|
// As mentioned, the entirety of v1 is implemented in terms of v2,
|
|
// where options are implicitly specified to opt into legacy behavior.
|
|
// For example, [Marshal] directly calls [jsonv2.Marshal] with [DefaultOptionsV1].
|
|
// Similarly, [Unmarshal] directly calls [jsonv2.Unmarshal] with [DefaultOptionsV1].
|
|
// The [DefaultOptionsV1] option represents the set of all options that specify
|
|
// default v1 behavior.
|
|
//
|
|
// For many of the behavior differences, there are Go struct field options
|
|
// that the author of a Go type can specify to control the behavior such that
|
|
// the type is represented identically in JSON under either v1 or v2 semantics.
|
|
//
|
|
// The availability of [DefaultOptionsV1] and [jsonv2.DefaultOptionsV2],
|
|
// where later options take precedence over former options allows for
|
|
// a gradual migration from v1 to v2. For example:
|
|
//
|
|
// - jsonv1.Marshal(v)
|
|
// uses default v1 semantics.
|
|
//
|
|
// - jsonv2.Marshal(v, jsonv1.DefaultOptionsV1())
|
|
// is semantically equivalent to jsonv1.Marshal
|
|
// and thus uses default v1 semantics.
|
|
//
|
|
// - jsonv2.Marshal(v, jsonv1.DefaultOptionsV1(), jsontext.AllowDuplicateNames(false))
|
|
// uses mostly v1 semantics, but opts into one particular v2-specific behavior.
|
|
//
|
|
// - jsonv2.Marshal(v, jsonv1.CallMethodsWithLegacySemantics(true))
|
|
// uses mostly v2 semantics, but opts into one particular v1-specific behavior.
|
|
//
|
|
// - jsonv2.Marshal(v, ..., jsonv2.DefaultOptionsV2())
|
|
// is semantically equivalent to jsonv2.Marshal since
|
|
// jsonv2.DefaultOptionsV2 overrides any options specified earlier
|
|
// and thus uses default v2 semantics.
|
|
//
|
|
// - jsonv2.Marshal(v)
|
|
// uses default v2 semantics.
|
|
//
|
|
// All new usages of "json" in Go should use the v2 package,
|
|
// but the v1 package will forever remain supported.
|
|
//
|
|
// See the [encoding/json/v2 Migration Guide] for additional detail on migration approaches.
|
|
//
|
|
// [encoding/json/v2 Migration Guide]: https://go.dev/doc/jsonv2-migration
|
|
package json
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
)
|
|
|
|
// Unmarshal parses the JSON-encoded data and stores the result
|
|
// in the value pointed to by v. If v is nil or not a pointer,
|
|
// Unmarshal returns an [InvalidUnmarshalError].
|
|
//
|
|
// Unmarshal uses the inverse of the encodings that
|
|
// [Marshal] uses, allocating maps, slices, and pointers as necessary,
|
|
// with the following additional rules:
|
|
//
|
|
// To unmarshal JSON into a pointer, Unmarshal first handles the case of
|
|
// the JSON being the JSON literal null. In that case, Unmarshal sets
|
|
// the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into
|
|
// the value pointed at by the pointer. If the pointer is nil, Unmarshal
|
|
// allocates a new value for it to point to.
|
|
//
|
|
// The JSON input is decoded according the following rules:
|
|
//
|
|
// - If the value type implements [jsonv2.UnmarshalerFrom],
|
|
// then the UnmarshalJSONFrom method is called to decode the JSON value.
|
|
// If the method returns [errors.ErrUnsupported],
|
|
// then the input is decoded according to subsequent rules.
|
|
//
|
|
// - If the value type implements [Unmarshaler],
|
|
// then the UnmarshalJSON method is called to decode the JSON value,
|
|
// including when the input is a JSON null.
|
|
//
|
|
// - If the value implements [encoding.TextUnmarshaler] and
|
|
// the input is a JSON string, then the UnmarshalText method
|
|
// is called with the unquoted form of the string.
|
|
//
|
|
// Otherwise, Unmarshal uses the following type-dependent default decodings:
|
|
//
|
|
// To unmarshal JSON into a struct, Unmarshal matches incoming object
|
|
// keys to the keys used by [Marshal] (either the struct field name or its tag),
|
|
// preferring an exact match but also accepting a case-insensitive match. By
|
|
// default, object keys which don't have a corresponding struct field are
|
|
// ignored (see [Decoder.DisallowUnknownFields] for an alternative).
|
|
//
|
|
// To unmarshal JSON into an interface value,
|
|
// Unmarshal stores one of these in the interface value:
|
|
//
|
|
// - bool, for JSON booleans
|
|
// - float64, for JSON numbers
|
|
// - string, for JSON strings
|
|
// - []any, for JSON arrays
|
|
// - map[string]any, for JSON objects
|
|
// - nil for JSON null
|
|
//
|
|
// To unmarshal a JSON array into a slice, Unmarshal decodes each JSON array
|
|
// element into the corresponding slice element, reusing existing slice
|
|
// elements in-place. The slice grows to accommodate additional elements,
|
|
// or is truncated if the JSON array is shorter.
|
|
// As a special case, to unmarshal an empty JSON array into a slice,
|
|
// Unmarshal replaces the slice with a new empty slice.
|
|
//
|
|
// To unmarshal a JSON array into a Go array, Unmarshal decodes
|
|
// JSON array elements into corresponding Go array elements.
|
|
// If the Go array is smaller than the JSON array,
|
|
// the additional JSON array elements are discarded.
|
|
// If the JSON array is smaller than the Go array,
|
|
// the additional Go array elements are set to zero values.
|
|
//
|
|
// To unmarshal a JSON object into a map, Unmarshal first establishes a map to
|
|
// use. If the map is nil, Unmarshal allocates a new map. Otherwise Unmarshal
|
|
// reuses the existing map, keeping existing entries. Unmarshal then stores
|
|
// key-value pairs from the JSON object into the map. The map's key type must
|
|
// either be any string type, an integer, or implement [encoding.TextUnmarshaler].
|
|
//
|
|
// If the JSON-encoded data contain a syntax error, Unmarshal returns a [SyntaxError].
|
|
//
|
|
// If a JSON value is not appropriate for a given target type,
|
|
// or if a JSON number overflows the target type, Unmarshal
|
|
// skips that field and completes the unmarshaling as best it can.
|
|
// If no more serious errors are encountered, Unmarshal returns
|
|
// an [UnmarshalTypeError] describing the earliest such error. In any
|
|
// case, it's not guaranteed that all the remaining fields following
|
|
// the problematic one will be unmarshaled into the target object.
|
|
//
|
|
// The JSON null value unmarshals into an interface, map, pointer, or slice
|
|
// by setting that Go value to nil. Because null is often used in JSON to mean
|
|
// “not present,” unmarshaling a JSON null into any other Go type has no effect
|
|
// on the value and produces no error.
|
|
//
|
|
// When unmarshaling quoted strings, invalid UTF-8 or
|
|
// invalid UTF-16 surrogate pairs are not treated as an error.
|
|
// Instead, they are replaced by the Unicode replacement
|
|
// character U+FFFD.
|
|
func Unmarshal(data []byte, v any) error {
|
|
return json.Unmarshal(data, v)
|
|
}
|
|
|
|
// Unmarshaler is the interface implemented by types
|
|
// that can unmarshal a JSON description of themselves.
|
|
// The input can be assumed to be a valid encoding of
|
|
// a JSON value. UnmarshalJSON must copy the JSON data
|
|
// if it wishes to retain the data after returning.
|
|
type Unmarshaler = json.Unmarshaler
|
|
|
|
// An UnmarshalTypeError describes a JSON value that was
|
|
// not appropriate for a value of a specific Go type.
|
|
type UnmarshalTypeError = json.UnmarshalTypeError
|
|
|
|
// An UnmarshalFieldError describes a JSON object key that
|
|
// led to an unexported (and therefore unwritable) struct field.
|
|
//
|
|
// Deprecated: No longer used; kept for compatibility.
|
|
type UnmarshalFieldError = json.UnmarshalFieldError
|
|
|
|
// An InvalidUnmarshalError describes an invalid argument passed to [Unmarshal].
|
|
// (The argument to [Unmarshal] must be a non-nil pointer.)
|
|
type InvalidUnmarshalError = json.InvalidUnmarshalError
|
|
|
|
// A Number represents a JSON number literal.
|
|
type Number = json.Number
|
|
|
|
// Marshal returns the JSON encoding of v.
|
|
//
|
|
// Marshal traverses the value v recursively.
|
|
//
|
|
// The input value is encoded as JSON according the following rules:
|
|
//
|
|
// - If the value type implements [jsonv2.MarshalerTo],
|
|
// then the MarshalJSONTo method is called to encode the value.
|
|
// If the method returns [errors.ErrUnsupported],
|
|
// then the input is encoded according to subsequent rules.
|
|
//
|
|
// - If the value type implements [Marshaler],
|
|
// then the MarshalJSON method is called to encode the value.
|
|
//
|
|
// - If the value type implements [encoding.TextAppender],
|
|
// then the AppendText method is called to encode the value and
|
|
// subsequently encode its result as a JSON string.
|
|
//
|
|
// - If the value type implements [encoding.TextMarshaler],
|
|
// then the MarshalText method is called to encode the value and
|
|
// subsequently encode its result as a JSON string.
|
|
//
|
|
// Otherwise, Marshal uses the following type-dependent default encodings:
|
|
//
|
|
// Boolean values encode as JSON booleans.
|
|
//
|
|
// Floating point, integer, and [Number] values encode as JSON numbers.
|
|
// NaN and +/-Inf values will return an [UnsupportedValueError].
|
|
//
|
|
// String values encode as JSON strings coerced to valid UTF-8,
|
|
// replacing invalid bytes with the Unicode replacement rune.
|
|
// So that the JSON will be safe to embed inside HTML <script> tags,
|
|
// the string is encoded using [HTMLEscape],
|
|
// which replaces "<", ">", "&", U+2028, and U+2029 are escaped
|
|
// to "\u003c","\u003e", "\u0026", "\u2028", and "\u2029".
|
|
// This replacement can be disabled when using an [Encoder],
|
|
// by calling [Encoder.SetEscapeHTML](false).
|
|
//
|
|
// Array and slice values encode as JSON arrays, except that
|
|
// []byte encodes as a base64-encoded string, and a nil slice
|
|
// encodes as the null JSON value.
|
|
//
|
|
// Struct values encode as JSON objects.
|
|
// Each exported struct field becomes a member of the object, using the
|
|
// field name as the object key, unless the field is omitted for one of the
|
|
// reasons given below.
|
|
//
|
|
// The encoding of each struct field can be customized by the format string
|
|
// stored under the "json" key in the struct field's tag.
|
|
// The format string gives the name of the field, possibly followed by a
|
|
// comma-separated list of options. The name may be empty in order to
|
|
// specify options without overriding the default field name.
|
|
//
|
|
// The "omitempty" option specifies that the field should be omitted
|
|
// from the encoding if the field has an empty value, defined as
|
|
// false, 0, a nil pointer, a nil interface value, and any array,
|
|
// slice, map, or string of length zero.
|
|
//
|
|
// As a special case, if the field tag is "-", the field is always omitted.
|
|
// JSON names containing commas or quotes, or names identical to "" or "-",
|
|
// can be specified using a single-quoted string literal, where the syntax
|
|
// is identical to the Go grammar for a double-quoted string literal,
|
|
// but instead uses single quotes as the delimiters.
|
|
//
|
|
// Examples of struct field tags and their meanings:
|
|
//
|
|
// // Field appears in JSON as key "myName".
|
|
// Field int `json:"myName"`
|
|
//
|
|
// // Field appears in JSON as key "myName" and
|
|
// // the field is omitted from the object if its value is empty,
|
|
// // as defined above.
|
|
// Field int `json:"myName,omitempty"`
|
|
//
|
|
// // Field appears in JSON as key "Field" (the default), but
|
|
// // the field is skipped if empty.
|
|
// // Note the leading comma.
|
|
// Field int `json:",omitempty"`
|
|
//
|
|
// // Field is ignored by this package.
|
|
// Field int `json:"-"`
|
|
//
|
|
// // Field appears in JSON as key "-".
|
|
// Field int `json:"'-'"`
|
|
//
|
|
// The "omitzero" option specifies that the field should be omitted
|
|
// from the encoding if the field has a zero value, according to rules:
|
|
//
|
|
// 1) If the field type has an "IsZero() bool" method, that will be used to
|
|
// determine whether the value is zero.
|
|
//
|
|
// 2) Otherwise, the value is zero if it is the zero value for its type.
|
|
//
|
|
// If both "omitempty" and "omitzero" are specified, the field will be omitted
|
|
// if the value is either empty or zero (or both).
|
|
//
|
|
// The "string" option signals that a field is stored as JSON inside a
|
|
// JSON-encoded string. It applies only to fields of string, floating point,
|
|
// integer, or boolean types. This extra level of encoding is sometimes used
|
|
// when communicating with JavaScript programs:
|
|
//
|
|
// Int64String int64 `json:",string"`
|
|
//
|
|
// The key name will be used if it's a non-empty string consisting of
|
|
// only Unicode letters, digits, and ASCII punctuation except quotation
|
|
// marks, backslash, and comma.
|
|
//
|
|
// Embedded struct fields are usually marshaled as if their inner exported fields
|
|
// were fields in the outer struct, subject to the usual Go visibility rules amended
|
|
// as described in the next paragraph.
|
|
// An anonymous struct field with a name given in its JSON tag is treated as
|
|
// having that name, rather than being anonymous.
|
|
// An anonymous struct field of interface type is treated the same as having
|
|
// that type as its name, rather than being anonymous.
|
|
//
|
|
// The Go visibility rules for struct fields are amended for JSON when
|
|
// deciding which field to marshal or unmarshal. If there are
|
|
// multiple fields at the same level, and that level is the least
|
|
// nested (and would therefore be the nesting level selected by the
|
|
// usual Go rules), the following extra rules apply:
|
|
//
|
|
// 1) Of those fields, if any are JSON-tagged, only tagged fields are considered,
|
|
// even if there are multiple untagged fields that would otherwise conflict.
|
|
//
|
|
// 2) If there is exactly one field (tagged or not according to the first rule), that is selected.
|
|
//
|
|
// 3) Otherwise there are multiple fields, and all are ignored; no error occurs.
|
|
//
|
|
// Handling of anonymous struct fields is new in Go 1.1.
|
|
// Prior to Go 1.1, anonymous struct fields were ignored. To force ignoring of
|
|
// an anonymous struct field in both current and earlier versions, give the field
|
|
// a JSON tag of "-".
|
|
//
|
|
// Map values encode as JSON objects. The map's key type must either be a
|
|
// string, an integer type, or implement [encoding.TextMarshaler]. The map keys
|
|
// are sorted and used as JSON object keys by applying the following rules,
|
|
// subject to the UTF-8 coercion described for string values above:
|
|
// - keys of any string type are used directly
|
|
// - keys that implement [encoding.TextMarshaler] are marshaled
|
|
// - integer keys are converted to strings
|
|
//
|
|
// Pointer values encode as the value pointed to.
|
|
// A nil pointer encodes as the null JSON value.
|
|
//
|
|
// Interface values encode as the value contained in the interface.
|
|
// A nil interface value encodes as the null JSON value.
|
|
//
|
|
// Channel, complex, and function values cannot be encoded in JSON.
|
|
// Attempting to encode such a value causes Marshal to return
|
|
// an [UnsupportedTypeError].
|
|
//
|
|
// JSON cannot represent cyclic data structures and Marshal does not
|
|
// handle them. Passing cyclic structures to Marshal will result in
|
|
// an error.
|
|
func Marshal(v any) ([]byte, error) {
|
|
return json.Marshal(v)
|
|
}
|
|
|
|
// MarshalIndent is like [Marshal] but applies [Indent] to format the output.
|
|
// Each JSON element in the output will begin on a new line beginning with prefix
|
|
// followed by one or more copies of indent according to the indentation nesting.
|
|
func MarshalIndent(v any, prefix, indent string) ([]byte, error) {
|
|
return json.MarshalIndent(v, prefix, indent)
|
|
}
|
|
|
|
// Marshaler is the interface implemented by types that
|
|
// can marshal themselves into valid JSON.
|
|
type Marshaler = json.Marshaler
|
|
|
|
// An UnsupportedTypeError is returned by [Marshal] when attempting
|
|
// to encode an unsupported value type.
|
|
type UnsupportedTypeError = json.UnsupportedTypeError
|
|
|
|
// An UnsupportedValueError is returned by [Marshal] when attempting
|
|
// to encode an unsupported value.
|
|
type UnsupportedValueError = json.UnsupportedValueError
|
|
|
|
// Before Go 1.2, an InvalidUTF8Error was returned by [Marshal] when
|
|
// attempting to encode a string value with invalid UTF-8 sequences.
|
|
// As of Go 1.2, [Marshal] instead coerces the string to valid UTF-8 by
|
|
// replacing invalid bytes with the Unicode replacement rune U+FFFD.
|
|
//
|
|
// Deprecated: No longer used; kept for compatibility.
|
|
type InvalidUTF8Error = json.InvalidUTF8Error
|
|
|
|
// A MarshalerError represents an error from calling a
|
|
// [Marshaler.MarshalJSON] or [encoding.TextMarshaler.MarshalText] method.
|
|
type MarshalerError = json.MarshalerError
|
|
|
|
// HTMLEscape appends to dst the JSON-encoded src with <, >, &, U+2028 and U+2029
|
|
// characters inside string literals changed to \u003c, \u003e, \u0026, \u2028, \u2029
|
|
// so that the JSON will be safe to embed inside HTML <script> tags.
|
|
// For historical reasons, web browsers don't honor standard HTML
|
|
// escaping within <script> tags, so an alternative JSON encoding must be used.
|
|
func HTMLEscape(dst *bytes.Buffer, src []byte) {
|
|
json.HTMLEscape(dst, src)
|
|
}
|
|
|
|
// Compact appends to dst the JSON-encoded src with
|
|
// insignificant space characters elided.
|
|
func Compact(dst *bytes.Buffer, src []byte) error {
|
|
return json.Compact(dst, src)
|
|
}
|
|
|
|
// Indent appends to dst an indented form of the JSON-encoded src.
|
|
// Each element in a JSON object or array begins on a new,
|
|
// indented line beginning with prefix followed by one or more
|
|
// copies of indent according to the indentation nesting.
|
|
// The data appended to dst does not begin with the prefix nor
|
|
// any indentation, to make it easier to embed inside other formatted JSON data.
|
|
// Although leading space characters (space, tab, carriage return, newline)
|
|
// at the beginning of src are dropped, trailing space characters
|
|
// at the end of src are preserved and copied to dst.
|
|
// For example, if src has no trailing spaces, neither will dst;
|
|
// if src ends in a trailing newline, so will dst.
|
|
func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
|
|
return json.Indent(dst, src, prefix, indent)
|
|
}
|
|
|
|
// Options are a set of options to configure the v2 "json" package
|
|
// to operate with v1 semantics for particular features.
|
|
// Values of this type can be passed to v2 functions like
|
|
// [jsonv2.Marshal] or [jsonv2.Unmarshal].
|
|
// Instead of referencing this type, use [jsonv2.Options].
|
|
//
|
|
// See the "Migrating to v2" section for guidance on how to migrate usage
|
|
// of "json" from using v1 to using v2 instead.
|
|
type Options = json.Options
|
|
|
|
// DefaultOptionsV1 is the full set of all options that define v1 semantics.
|
|
// It is equivalent to the following boolean options being set to true:
|
|
//
|
|
// - [CallMethodsWithLegacySemantics]
|
|
// - [FormatByteArrayAsArray]
|
|
// - [FormatBytesWithLegacySemantics]
|
|
// - [FormatDurationAsNano]
|
|
// - [MatchCaseSensitiveDelimiter]
|
|
// - [MergeWithLegacySemantics]
|
|
// - [OmitEmptyWithLegacySemantics]
|
|
// - [ParseBytesWithLooseRFC4648]
|
|
// - [ParseTimeWithLooseRFC3339]
|
|
// - [ReportErrorsWithLegacySemantics]
|
|
// - [StringifyWithLegacySemantics]
|
|
// - [UnmarshalArrayFromAnyLength]
|
|
// - [jsonv2.Deterministic]
|
|
// - [jsonv2.FormatNilMapAsNull]
|
|
// - [jsonv2.FormatNilSliceAsNull]
|
|
// - [jsonv2.MatchCaseInsensitiveNames]
|
|
// - [jsontext.AllowDuplicateNames]
|
|
// - [jsontext.AllowInvalidUTF8]
|
|
// - [jsontext.EscapeForHTML]
|
|
// - [jsontext.EscapeForJS]
|
|
// - [jsontext.PreserveRawStrings]
|
|
//
|
|
// All other options are not present.
|
|
//
|
|
// The [Marshal] and [Unmarshal] functions in this package are
|
|
// semantically identical to calling the v2 equivalents with this option:
|
|
//
|
|
// jsonv2.Marshal(v, jsonv1.DefaultOptionsV1())
|
|
// jsonv2.Unmarshal(b, v, jsonv1.DefaultOptionsV1())
|
|
func DefaultOptionsV1() Options {
|
|
return json.DefaultOptionsV1()
|
|
}
|
|
|
|
// CallMethodsWithLegacySemantics specifies that calling of type-provided
|
|
// marshal and unmarshal methods follow legacy semantics:
|
|
//
|
|
// - When marshaling, a marshal method declared on a pointer receiver
|
|
// is only called if the Go value is addressable.
|
|
// Values obtained from an interface or map element are not addressable.
|
|
// Values obtained from a pointer or slice element are addressable.
|
|
// Values obtained from an array element or struct field inherit
|
|
// the addressability of the parent. In contrast, the v2 semantic
|
|
// is to always call marshal methods regardless of addressability.
|
|
//
|
|
// - When marshaling or unmarshaling, the [Marshaler] or [Unmarshaler]
|
|
// methods are ignored for map keys. However, [encoding.TextMarshaler]
|
|
// or [encoding.TextUnmarshaler] are still callable.
|
|
// In contrast, the v2 semantic is to serialize map keys
|
|
// like any other value (with regard to calling methods),
|
|
// which may include calling [Marshaler] or [Unmarshaler] methods,
|
|
// where it is the implementation's responsibility to represent the
|
|
// Go value as a JSON string (as required for JSON object names).
|
|
//
|
|
// - When marshaling, if a map key value implements a marshal method
|
|
// and is a nil pointer, then it is serialized as an empty JSON string.
|
|
// In contrast, the v2 semantic is to report an error.
|
|
//
|
|
// - When marshaling, if an interface type implements a marshal method
|
|
// and the interface value is a nil pointer to a concrete type,
|
|
// then the marshal method is always called.
|
|
// In contrast, the v2 semantic is to never directly call methods
|
|
// on interface values and to instead defer evaluation based upon
|
|
// the underlying concrete value. Similar to non-interface values,
|
|
// marshal methods are not called on nil pointers and
|
|
// are instead serialized as a JSON null.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func CallMethodsWithLegacySemantics(v bool) Options {
|
|
return json.CallMethodsWithLegacySemantics(v)
|
|
}
|
|
|
|
// FormatByteArrayAsArray specifies that a Go [N]byte is
|
|
// formatted as a normal Go array in contrast to the v2 default of
|
|
// formatting [N]byte as using binary data encoding (RFC 4648).
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func FormatByteArrayAsArray(v bool) Options {
|
|
return json.FormatByteArrayAsArray(v)
|
|
}
|
|
|
|
// FormatBytesWithLegacySemantics specifies that handling of
|
|
// []~byte and [N]~byte types follow legacy semantics:
|
|
//
|
|
// - A Go []~byte is to be treated as using some form of
|
|
// binary data encoding (RFC 4648) in contrast to the v2 default
|
|
// of only treating []byte as such. In particular, v2 does not
|
|
// treat slices of named byte types as representing binary data.
|
|
//
|
|
// - When marshaling, if a named byte implements a marshal method,
|
|
// then the slice is serialized as a JSON array of elements,
|
|
// each of which call the marshal method.
|
|
//
|
|
// - When unmarshaling, if the input is a JSON array,
|
|
// then unmarshal into the []~byte as if it were a normal Go slice.
|
|
// In contrast, the v2 default is to report an error unmarshaling
|
|
// a JSON array when expecting some form of binary data encoding.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func FormatBytesWithLegacySemantics(v bool) Options {
|
|
return json.FormatBytesWithLegacySemantics(v)
|
|
}
|
|
|
|
// FormatDurationAsNano specifies that a [time.Duration] is
|
|
// formatted as a JSON number representing the number of nanoseconds
|
|
// in contrast to the v2 default of reporting an error.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func FormatDurationAsNano(v bool) Options {
|
|
return json.FormatDurationAsNano(v)
|
|
}
|
|
|
|
// MatchCaseSensitiveDelimiter specifies that underscores and dashes are
|
|
// not to be ignored when performing case-insensitive name matching which
|
|
// occurs under [jsonv2.MatchCaseInsensitiveNames] or the `case:ignore` tag option.
|
|
// Thus, case-insensitive name matching is identical to [strings.EqualFold].
|
|
// Use of this option diminishes the ability of case-insensitive matching
|
|
// to be able to match common case variants (e.g., "foo_bar" with "fooBar").
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func MatchCaseSensitiveDelimiter(v bool) Options {
|
|
return json.MatchCaseSensitiveDelimiter(v)
|
|
}
|
|
|
|
// MergeWithLegacySemantics specifies that unmarshaling into a non-zero
|
|
// Go value follows legacy semantics:
|
|
//
|
|
// - When unmarshaling a JSON null, this preserves the original Go value
|
|
// if the kind is a bool, int, uint, float, string, array, or struct.
|
|
// Otherwise, it zeros the Go value.
|
|
// In contrast, the default v2 behavior is to consistently and always
|
|
// zero the Go value when unmarshaling a JSON null into it.
|
|
//
|
|
// - When unmarshaling a JSON value other than null, this merges into
|
|
// the original Go value for array elements, slice elements,
|
|
// struct fields (but not map values),
|
|
// pointer values, and interface values (only if a non-nil pointer).
|
|
// For slices, it will merge into the pre-existing value of slice elements
|
|
// even for those past the slice length. If the original slice length
|
|
// was longer than the JSON array, then it is truncated to match.
|
|
// In contrast, the default v2 behavior is to merge into the Go value
|
|
// for struct fields, map values, pointer values, and interface values.
|
|
// In general, the v2 semantic merges when unmarshaling a JSON object,
|
|
// otherwise it replaces the original value.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
// The v1 default is true.
|
|
func MergeWithLegacySemantics(v bool) Options {
|
|
return json.MergeWithLegacySemantics(v)
|
|
}
|
|
|
|
// OmitEmptyWithLegacySemantics specifies that the `omitempty` tag option
|
|
// follows a definition of empty where a field is omitted if the Go value is
|
|
// false, 0, a nil pointer, a nil interface value,
|
|
// or any empty array, slice, map, or string.
|
|
// This overrides the v2 semantic where a field is empty if the value
|
|
// marshals as a JSON null or an empty JSON string, object, or array.
|
|
//
|
|
// The v1 and v2 definitions of `omitempty` are practically the same for
|
|
// Go strings, slices, arrays, and maps. Usages of `omitempty` on
|
|
// Go bools, ints, uints, floats, pointers, and interfaces should migrate to use
|
|
// the `omitzero` tag option, which omits a field if it is the zero Go value.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
// The v1 default is true.
|
|
func OmitEmptyWithLegacySemantics(v bool) Options {
|
|
return json.OmitEmptyWithLegacySemantics(v)
|
|
}
|
|
|
|
// ParseBytesWithLooseRFC4648 specifies that when parsing
|
|
// binary data encoded as "base32" or "base64",
|
|
// to ignore the presence of '\r' and '\n' characters.
|
|
// In contrast, the v2 default is to report an error in order to be
|
|
// strictly compliant with RFC 4648, section 3.3,
|
|
// which specifies that non-alphabet characters must be rejected.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
// The v1 default is true.
|
|
func ParseBytesWithLooseRFC4648(v bool) Options {
|
|
return json.ParseBytesWithLooseRFC4648(v)
|
|
}
|
|
|
|
// ParseTimeWithLooseRFC3339 specifies that a [time.Time]
|
|
// parses according to loose adherence to RFC 3339.
|
|
// In particular, it permits historically incorrect representations,
|
|
// allowing for deviations in hour format, sub-second separator,
|
|
// and timezone representation. In contrast, the default v2 behavior
|
|
// is to strictly comply with the grammar specified in RFC 3339.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
// The v1 default is true.
|
|
func ParseTimeWithLooseRFC3339(v bool) Options {
|
|
return json.ParseTimeWithLooseRFC3339(v)
|
|
}
|
|
|
|
// ReportErrorsWithLegacySemantics specifies that Marshal and Unmarshal
|
|
// should report errors with legacy semantics:
|
|
//
|
|
// - When marshaling or unmarshaling, the returned error values are
|
|
// usually of types such as [SyntaxError], [MarshalerError],
|
|
// [UnsupportedTypeError], [UnsupportedValueError],
|
|
// [InvalidUnmarshalError], or [UnmarshalTypeError].
|
|
// In contrast, the v2 semantic is to always return errors as either
|
|
// [jsonv2.SemanticError] or [jsontext.SyntacticError].
|
|
//
|
|
// - When marshaling, if a user-defined marshal method reports an error,
|
|
// it is always wrapped in a [MarshalerError], even if the error itself
|
|
// is already a [MarshalerError], which may lead to multiple redundant
|
|
// layers of wrapping. In contrast, the v2 semantic is to
|
|
// always wrap an error within [jsonv2.SemanticError]
|
|
// unless it is already a semantic error.
|
|
//
|
|
// - When unmarshaling, if a user-defined unmarshal method reports an error,
|
|
// it is never wrapped and reported verbatim. In contrast, the v2 semantic
|
|
// is to always wrap an error within [jsonv2.SemanticError]
|
|
// unless it is already a semantic error.
|
|
//
|
|
// - When marshaling or unmarshaling, if a Go struct contains type errors
|
|
// (e.g., conflicting names or malformed field tags), then such errors
|
|
// are ignored and the Go struct uses a best-effort representation.
|
|
// In contrast, the v2 semantic is to report a runtime error.
|
|
//
|
|
// - When unmarshaling with [jsonv2.MatchCaseInsensitiveNames], if a JSON
|
|
// object name has a non-exact match with multiple Go struct fields, then
|
|
// an error is not reported and instead the first declared field is used.
|
|
// In contrast, the v2 semantic is to report a runtime error.
|
|
//
|
|
// - When unmarshaling, the syntactic structure of the JSON input
|
|
// is fully validated before performing the semantic unmarshaling
|
|
// of the JSON data into the Go value. Practically speaking,
|
|
// this means that JSON input with syntactic errors do not result
|
|
// in any mutations of the target Go value. In contrast, the v2 semantic
|
|
// is to perform a streaming decode and gradually unmarshal the JSON input
|
|
// into the target Go value, which means that the Go value may be
|
|
// partially mutated when a syntactic error is encountered.
|
|
//
|
|
// - When unmarshaling, a semantic error does not immediately terminate the
|
|
// unmarshal procedure, but rather evaluation continues.
|
|
// When unmarshal returns, only the first semantic error is reported.
|
|
// In contrast, the v2 semantic is to terminate unmarshal the moment
|
|
// an error is encountered.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func ReportErrorsWithLegacySemantics(v bool) Options {
|
|
return json.ReportErrorsWithLegacySemantics(v)
|
|
}
|
|
|
|
// StringifyWithLegacySemantics specifies that the `string` tag option
|
|
// may stringify bools and string values. It only takes effect on fields
|
|
// where the top-level type is a bool, string, numeric kind, or a pointer to
|
|
// such a kind. In contrast, the v2 default only allows the `string` tag option
|
|
// on Go types that would have otherwise serialized as a JSON number,
|
|
// and stringifies the JSON number within a JSON string. In particular,
|
|
// the v2 default does not stringify Go bools and strings.
|
|
// If [ReportErrorsWithLegacySemantics] is false,
|
|
// then incorrect usages of `string` result in a runtime error.
|
|
//
|
|
// When marshaling, such Go values are serialized as their usual JSON
|
|
// representation, but quoted within a JSON string.
|
|
// When unmarshaling, such Go values must be deserialized from a JSON string
|
|
// containing their usual JSON representation or Go number representation for
|
|
// that numeric kind.
|
|
// Note that the Go number grammar is a superset of the JSON number grammar.
|
|
// A JSON null quoted in a JSON string is a valid substitute for JSON null
|
|
// while unmarshaling into a Go value that `string` takes effect on.
|
|
// In contrast, the v2 default rejects stringified numbers outside of the
|
|
// grammar for a JSON number and also rejects a JSON null quoted in a JSON string.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// The v1 default is true.
|
|
func StringifyWithLegacySemantics(v bool) Options {
|
|
return json.StringifyWithLegacySemantics(v)
|
|
}
|
|
|
|
// UnmarshalArrayFromAnyLength specifies that Go arrays can be unmarshaled
|
|
// from input JSON arrays of any length. If the JSON array is too short,
|
|
// then the remaining Go array elements are zeroed. If the JSON array
|
|
// is too long, then the excess JSON array elements are skipped over.
|
|
// In contrast, the v2 default expects that Go arrays be unmarshaled
|
|
// from input JSON arrays of the exact same length.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
// The v1 default is true.
|
|
func UnmarshalArrayFromAnyLength(v bool) Options {
|
|
return json.UnmarshalArrayFromAnyLength(v)
|
|
}
|
|
|
|
// Valid reports whether data is a valid JSON encoding.
|
|
func Valid(data []byte) bool {
|
|
return json.Valid(data)
|
|
}
|
|
|
|
// A SyntaxError is a description of a JSON syntax error.
|
|
// [Unmarshal] will return a SyntaxError if the JSON can't be parsed.
|
|
type SyntaxError = json.SyntaxError
|
|
|
|
// A Decoder reads and decodes JSON values from an input stream.
|
|
type Decoder = json.Decoder
|
|
|
|
// NewDecoder returns a new decoder that reads from r.
|
|
//
|
|
// The decoder introduces its own buffering and may
|
|
// read data from r beyond the JSON values requested.
|
|
func NewDecoder(r io.Reader) *Decoder {
|
|
return json.NewDecoder(r)
|
|
}
|
|
|
|
// An Encoder writes JSON values to an output stream.
|
|
type Encoder = json.Encoder
|
|
|
|
// NewEncoder returns a new encoder that writes to w.
|
|
func NewEncoder(w io.Writer) *Encoder {
|
|
return json.NewEncoder(w)
|
|
}
|
|
|
|
// RawMessage is a raw encoded JSON value.
|
|
// It implements [Marshaler] and [Unmarshaler] and can
|
|
// be used to delay JSON decoding or precompute a JSON encoding.
|
|
type RawMessage = json.RawMessage
|
|
|
|
// A Token holds a value of one of these types:
|
|
//
|
|
// - [Delim], for the four JSON delimiters [ ] { }
|
|
// - bool, for JSON booleans
|
|
// - float64, for JSON numbers
|
|
// - [Number], for JSON numbers
|
|
// - string, for JSON string literals
|
|
// - nil, for JSON null
|
|
type Token = json.Token
|
|
|
|
// A Delim is a JSON array or object delimiter, one of [ ] { or }.
|
|
type Delim = json.Delim
|