986 lines
49 KiB
Go
986 lines
49 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 semantic processing of JSON as specified in RFC 8259.
|
|
// JSON is a simple data interchange format that can represent
|
|
// primitive data types such as booleans, strings, and numbers,
|
|
// in addition to structured data types such as objects and arrays.
|
|
//
|
|
// [Marshal] and [Unmarshal] encode and decode Go values
|
|
// to/from JSON text contained within a []byte.
|
|
// [MarshalWrite] and [UnmarshalRead] operate on JSON text
|
|
// by writing to or reading from an [io.Writer] or [io.Reader].
|
|
// [MarshalEncode] and [UnmarshalDecode] operate on JSON text
|
|
// by encoding to or decoding from a [jsontext.Encoder] or [jsontext.Decoder].
|
|
// [Options] may be passed to each of the marshal or unmarshal functions
|
|
// to configure the semantic behavior of marshaling and unmarshaling
|
|
// (i.e., alter how JSON data is understood as Go data and vice versa).
|
|
// [jsontext.Options] may also be passed to the marshal or unmarshal functions
|
|
// to configure the syntactic behavior of encoding or decoding.
|
|
//
|
|
// The data types of JSON are mapped to/from the data types of Go based on
|
|
// the closest logical equivalent between the two type systems. For example,
|
|
// a JSON boolean corresponds with a Go bool,
|
|
// a JSON string corresponds with a Go string,
|
|
// a JSON number corresponds with a Go int, uint or float,
|
|
// a JSON array corresponds with a Go slice or array, and
|
|
// a JSON object corresponds with a Go struct or map.
|
|
// See the documentation on [Marshal] and [Unmarshal] for a comprehensive list
|
|
// of how the JSON and Go type systems correspond.
|
|
//
|
|
// Arbitrary Go types can customize their JSON representation by implementing
|
|
// [Marshaler], [MarshalerTo], [Unmarshaler], or [UnmarshalerFrom].
|
|
// This provides authors of Go types with control over how their types are
|
|
// serialized as JSON. Alternatively, users can implement functions that match
|
|
// [MarshalFunc], [MarshalToFunc], [UnmarshalFunc], or [UnmarshalFromFunc]
|
|
// to specify the JSON representation for arbitrary types.
|
|
// This provides callers of JSON functionality with control over
|
|
// how any arbitrary type is serialized as JSON.
|
|
//
|
|
// # JSON Representation of Go structs
|
|
//
|
|
// A Go struct is naturally represented as a JSON object,
|
|
// where each Go struct field corresponds with a JSON object member.
|
|
// When marshaling, all Go struct fields are recursively encoded in depth-first
|
|
// order as JSON object members except those that are ignored or omitted.
|
|
// When unmarshaling, JSON object members are recursively decoded
|
|
// into the corresponding Go struct fields.
|
|
// Object members that do not match any struct fields,
|
|
// also known as “unknown members”, are ignored by default or rejected
|
|
// if [RejectUnknownMembers] is specified.
|
|
//
|
|
// The representation of each struct field can be customized in the
|
|
// "json" struct field tag, where the tag is a comma separated list of options.
|
|
// As a special case, if the entire tag is `json:"-"`,
|
|
// then the field is ignored with regard to its JSON representation.
|
|
// Some options also have equivalent behavior controlled by a caller-specified [Options].
|
|
// Field-specified options take precedence over caller-specified options.
|
|
//
|
|
// The first option is the JSON object name override for the Go struct field.
|
|
// If the name is not specified, then the Go struct field name
|
|
// is used as the JSON object name. 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.
|
|
// By default, unmarshaling uses case-sensitive matching to identify
|
|
// the Go struct field associated with a JSON object name.
|
|
//
|
|
// After the name, the following tag options are supported:
|
|
//
|
|
// - omitzero: When marshaling, the "omitzero" option specifies that
|
|
// the struct field should be omitted if the field value is zero
|
|
// as determined by the "IsZero() bool" method if present,
|
|
// otherwise based on whether the field is the zero Go value.
|
|
// This option has no effect when unmarshaling.
|
|
//
|
|
// - omitempty: When marshaling, the "omitempty" option specifies that
|
|
// the struct field should be omitted if the field value would have been
|
|
// encoded as a JSON null, empty string, empty object, or empty array.
|
|
// This option has no effect when unmarshaling.
|
|
//
|
|
// - string: The "string" option specifies that [StringifyNumbers]
|
|
// be set when marshaling or unmarshaling a struct field value.
|
|
// This causes numeric types to be encoded as a JSON number
|
|
// within a JSON string, and to be decoded from a JSON string
|
|
// containing the JSON number without any surrounding whitespace.
|
|
// This extra level of encoding is often necessary since
|
|
// many JSON parsers cannot precisely represent 64-bit integers.
|
|
//
|
|
// - case: When unmarshaling, the "case" option specifies how
|
|
// JSON object names are matched with the JSON name for Go struct fields.
|
|
// The option is a key-value pair specified as "case:value" where
|
|
// the value must either be 'ignore' or 'strict'.
|
|
// The 'ignore' value specifies that matching is case-insensitive
|
|
// where dashes and underscores are also ignored. If multiple fields match,
|
|
// the first declared field in breadth-first order takes precedence.
|
|
// The 'strict' value specifies that matching is case-sensitive.
|
|
// This takes precedence over the [MatchCaseInsensitiveNames] option.
|
|
//
|
|
// - inline: The "inline" option specifies that
|
|
// the JSON representable content of this field type is to be promoted
|
|
// as if they were specified in the parent struct.
|
|
// It is the JSON equivalent of Go struct embedding.
|
|
// A Go embedded field is implicitly inlined unless an explicit JSON name
|
|
// is specified. The inlined field must be a Go struct
|
|
// (that does not implement any JSON methods), [jsontext.Value],
|
|
// map[~string]T, or an unnamed pointer to such types. When marshaling,
|
|
// inlined fields from a pointer type are omitted if it is nil.
|
|
// Inlined fields of type [jsontext.Value] and map[~string]T are called
|
|
// “inlined fallbacks” as they can represent all possible
|
|
// JSON object members not directly handled by the parent struct.
|
|
// Only one inlined fallback field may be specified in a struct,
|
|
// while many non-fallback fields may be specified. This option
|
|
// must not be specified with any other option (including the JSON name).
|
|
//
|
|
// - unknown: The "unknown" option is a specialized variant
|
|
// of the inlined fallback to indicate that this Go struct field
|
|
// contains any number of unknown JSON object members. The field type must
|
|
// be a [jsontext.Value], map[~string]T, or an unnamed pointer to such types.
|
|
// If [DiscardUnknownMembers] is specified when marshaling,
|
|
// the contents of this field are ignored.
|
|
// If [RejectUnknownMembers] is specified when unmarshaling,
|
|
// any unknown object members are rejected regardless of whether
|
|
// an inlined fallback with the "unknown" option exists. This option
|
|
// must not be specified with any other option (including the JSON name).
|
|
//
|
|
// - format: The "format" option specifies a format flag
|
|
// used to specialize the formatting of the field value.
|
|
// The option is a key-value pair specified as "format:value" where
|
|
// the value must be either a literal consisting of letters and numbers
|
|
// (e.g., "format:RFC3339") or a single-quoted string literal
|
|
// (e.g., "format:'2006-01-02'"). The interpretation of the format flag
|
|
// is determined by the struct field type.
|
|
//
|
|
// The "omitzero" and "omitempty" options are mostly semantically identical.
|
|
// The former is defined in terms of the Go type system,
|
|
// while the latter in terms of the JSON type system.
|
|
// Consequently they behave differently in some circumstances.
|
|
// For example, only a nil slice or map is omitted under "omitzero", while
|
|
// an empty slice or map is omitted under "omitempty" regardless of nilness.
|
|
// The "omitzero" option is useful for types with a well-defined zero value
|
|
// (e.g., [net/netip.Addr]) or have an IsZero method (e.g., [time.Time.IsZero]).
|
|
//
|
|
// Every Go struct corresponds to a list of JSON representable fields
|
|
// which is constructed by performing a breadth-first search over
|
|
// all struct fields (excluding unexported or ignored fields),
|
|
// where the search recursively descends into inlined structs.
|
|
// The set of non-inlined fields in a struct must have unique JSON names.
|
|
// If multiple fields all have the same JSON name, then the one
|
|
// at shallowest depth takes precedence and the other fields at deeper depths
|
|
// are excluded from the list of JSON representable fields.
|
|
// If multiple fields at the shallowest depth have the same JSON name,
|
|
// but exactly one is explicitly tagged with a JSON name,
|
|
// then that field takes precedence and all others are excluded from the list.
|
|
// This is analogous to Go visibility rules for struct field selection
|
|
// with embedded struct types.
|
|
//
|
|
// Marshaling or unmarshaling a non-empty struct
|
|
// without any JSON representable fields results in a [SemanticError].
|
|
// Unexported fields must not have any `json` tags except for `json:"-"`.
|
|
//
|
|
// # Security Considerations
|
|
//
|
|
// JSON is frequently used as a data interchange format to communicate
|
|
// between different systems, possibly implemented in different languages.
|
|
// For interoperability and security reasons, it is important that
|
|
// all implementations agree upon the semantic meaning of the data.
|
|
//
|
|
// [For example, suppose we have two micro-services.]
|
|
// The first service is responsible for authenticating a JSON request,
|
|
// while the second service is responsible for executing the request
|
|
// (having assumed that the prior service authenticated the request).
|
|
// If an attacker were able to maliciously craft a JSON request such that
|
|
// both services believe that the same request is from different users,
|
|
// it could bypass the authenticator with valid credentials for one user,
|
|
// but maliciously perform an action on behalf of a different user.
|
|
//
|
|
// According to RFC 8259, there unfortunately exist many JSON texts
|
|
// that are syntactically valid but semantically ambiguous.
|
|
// For example, the standard does not define how to interpret duplicate
|
|
// names within an object.
|
|
//
|
|
// The v1 [encoding/json] and [encoding/json/v2] packages
|
|
// interpret some inputs in different ways. In particular:
|
|
//
|
|
// - The standard specifies that JSON must be encoded using UTF-8.
|
|
// By default, v1 replaces invalid bytes of UTF-8 in JSON strings
|
|
// with the Unicode replacement character,
|
|
// while v2 rejects inputs with invalid UTF-8.
|
|
// To change the default, specify the [jsontext.AllowInvalidUTF8] option.
|
|
// The replacement of invalid UTF-8 is a form of data corruption
|
|
// that alters the precise meaning of strings.
|
|
//
|
|
// - The standard does not specify a particular behavior when
|
|
// duplicate names are encountered within a JSON object,
|
|
// which means that different implementations may behave differently.
|
|
// By default, v1 allows for the presence of duplicate names,
|
|
// while v2 rejects duplicate names.
|
|
// To change the default, specify the [jsontext.AllowDuplicateNames] option.
|
|
// If allowed, object members are processed in the order they are observed,
|
|
// meaning that later values will replace or be merged into prior values,
|
|
// depending on the Go value type.
|
|
//
|
|
// - The standard defines a JSON object as an unordered collection of name/value pairs.
|
|
// While ordering can be observed through the underlying [jsontext] API,
|
|
// both v1 and v2 generally avoid exposing the ordering.
|
|
// No application should semantically depend on the order of object members.
|
|
// Allowing duplicate names is a vector through which ordering of members
|
|
// can accidentally be observed and depended upon.
|
|
//
|
|
// - The standard suggests that JSON object names are typically compared
|
|
// based on equality of the sequence of Unicode code points,
|
|
// which implies that comparing names is often case-sensitive.
|
|
// When unmarshaling a JSON object into a Go struct,
|
|
// by default, v1 uses a (loose) case-insensitive match on the name,
|
|
// while v2 uses a (strict) case-sensitive match on the name.
|
|
// To change the default, specify the [MatchCaseInsensitiveNames] option.
|
|
// The use of case-insensitive matching provides another vector through
|
|
// which duplicate names can occur. Allowing case-insensitive matching
|
|
// means that v1 or v2 might interpret JSON objects differently from most
|
|
// other JSON implementations (which typically use a case-sensitive match).
|
|
//
|
|
// - The standard does not specify a particular behavior when
|
|
// an unknown name in a JSON object is encountered.
|
|
// When unmarshaling a JSON object into a Go struct, by default
|
|
// both v1 and v2 ignore unknown names and their corresponding values.
|
|
// To change the default, specify the [RejectUnknownMembers] option.
|
|
//
|
|
// - The standard suggests that implementations may use a float64
|
|
// to represent a JSON number. Consequently, large JSON integers
|
|
// may lose precision when stored as a floating-point type.
|
|
// Both v1 and v2 correctly preserve precision when marshaling and
|
|
// unmarshaling a concrete integer type. However, even if v1 and v2
|
|
// preserve precision for concrete types, other JSON implementations
|
|
// may not be able to preserve precision for outputs produced by v1 or v2.
|
|
// The `string` tag option can be used to specify that an integer type
|
|
// is to be quoted within a JSON string to avoid loss of precision.
|
|
// Furthermore, v1 and v2 may still lose precision when unmarshaling
|
|
// into an any interface value, where unmarshal uses a float64
|
|
// by default to represent a JSON number.
|
|
// To change the default, specify the [WithUnmarshalers] option
|
|
// with a custom unmarshaler that pre-populates the interface value
|
|
// with a concrete Go type that can preserve precision.
|
|
//
|
|
// RFC 8785 specifies a canonical form for any JSON text,
|
|
// which explicitly defines specific behaviors that RFC 8259 leaves undefined.
|
|
// In theory, if a text can successfully [jsontext.Value.Canonicalize]
|
|
// without changing the semantic meaning of the data, then it provides a
|
|
// greater degree of confidence that the data is more secure and interoperable.
|
|
//
|
|
// The v2 API generally chooses more secure defaults than v1,
|
|
// but care should still be taken with large integers or unknown members.
|
|
//
|
|
// [For example, suppose we have two micro-services.]: https://www.youtube.com/watch?v=avilmOcHKHE&t=1057s
|
|
package json
|
|
|
|
import (
|
|
"encoding/json/jsontext"
|
|
"encoding/json/v2"
|
|
"io"
|
|
)
|
|
|
|
// Marshal serializes a Go value as a []byte according to the provided
|
|
// marshal and encode options (while ignoring unmarshal or decode options).
|
|
// It does not terminate the output with a newline.
|
|
//
|
|
// Type-specific marshal functions and methods take precedence
|
|
// over the default representation of a value.
|
|
// Functions or methods that operate on *T are only called when encoding
|
|
// a value of type T (by taking its address) or a non-nil value of *T.
|
|
// Marshal ensures that a value is always addressable
|
|
// (by boxing it on the heap if necessary) so that
|
|
// these functions and methods can be consistently called. For performance,
|
|
// it is recommended that Marshal be passed a non-nil pointer to the value.
|
|
//
|
|
// The input value is encoded as JSON according the following rules:
|
|
//
|
|
// - If any type-specific functions in a [WithMarshalers] option match
|
|
// the value type, then those functions are called to encode the value.
|
|
// If all applicable functions return [SkipFunc],
|
|
// then the value is encoded according to subsequent rules.
|
|
//
|
|
// - If the value type implements [MarshalerTo],
|
|
// then the MarshalJSONTo method is called to encode the value.
|
|
//
|
|
// - 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, the value is encoded according to the value's type
|
|
// as described in detail below.
|
|
//
|
|
// Most Go types have a default JSON representation.
|
|
// Certain types support specialized formatting according to
|
|
// a format flag optionally specified in the Go struct tag
|
|
// for the struct field that contains the current value
|
|
// (see the “JSON Representation of Go structs” section for more details).
|
|
//
|
|
// The representation of each type is as follows:
|
|
//
|
|
// - A Go boolean is encoded as a JSON boolean (e.g., true or false).
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go string is encoded as a JSON string.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go []byte or [N]byte is encoded as a JSON string containing
|
|
// the binary value encoded using RFC 4648.
|
|
// If the format is "base64" or unspecified, then this uses RFC 4648, section 4.
|
|
// If the format is "base64url", then this uses RFC 4648, section 5.
|
|
// If the format is "base32", then this uses RFC 4648, section 6.
|
|
// If the format is "base32hex", then this uses RFC 4648, section 7.
|
|
// If the format is "base16" or "hex", then this uses RFC 4648, section 8.
|
|
// If the format is "array", then the bytes value is encoded as a JSON array
|
|
// where each byte is recursively JSON-encoded as each JSON array element.
|
|
//
|
|
// - A Go integer is encoded as a JSON number without fractions or exponents.
|
|
// If [StringifyNumbers] is specified or encoding a JSON object name,
|
|
// then the JSON number is encoded within a JSON string.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go float is encoded as a JSON number.
|
|
// If [StringifyNumbers] is specified or encoding a JSON object name,
|
|
// then the JSON number is encoded within a JSON string.
|
|
// If the format is "nonfinite", then NaN, +Inf, and -Inf are encoded as
|
|
// the JSON strings "NaN", "Infinity", and "-Infinity", respectively.
|
|
// Otherwise, the presence of non-finite numbers results in a [SemanticError].
|
|
//
|
|
// - A Go map is encoded as a JSON object, where each Go map key and value
|
|
// is recursively encoded as a name and value pair in the JSON object.
|
|
// The Go map key must encode as a JSON string, otherwise this results
|
|
// in a [SemanticError]. The Go map is traversed in a non-deterministic order.
|
|
// For deterministic encoding, consider using the [Deterministic] option.
|
|
// If the format is "emitnull", then a nil map is encoded as a JSON null.
|
|
// If the format is "emitempty", then a nil map is encoded as an empty JSON object,
|
|
// regardless of whether [FormatNilMapAsNull] is specified.
|
|
// Otherwise by default, a nil map is encoded as an empty JSON object.
|
|
//
|
|
// - A Go struct is encoded as a JSON object.
|
|
// See the “JSON Representation of Go structs” section
|
|
// in the package-level documentation for more details.
|
|
//
|
|
// - A Go slice is encoded as a JSON array, where each Go slice element
|
|
// is recursively JSON-encoded as the elements of the JSON array.
|
|
// If the format is "emitnull", then a nil slice is encoded as a JSON null.
|
|
// If the format is "emitempty", then a nil slice is encoded as an empty JSON array,
|
|
// regardless of whether [FormatNilSliceAsNull] is specified.
|
|
// Otherwise by default, a nil slice is encoded as an empty JSON array.
|
|
//
|
|
// - A Go array is encoded as a JSON array, where each Go array element
|
|
// is recursively JSON-encoded as the elements of the JSON array.
|
|
// The JSON array length is always identical to the Go array length.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go pointer is encoded as a JSON null if nil, otherwise it is
|
|
// the recursively JSON-encoded representation of the underlying value.
|
|
// Format flags are forwarded to the encoding of the underlying value.
|
|
//
|
|
// - A Go interface is encoded as a JSON null if nil, otherwise it is
|
|
// the recursively JSON-encoded representation of the underlying value.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go [time.Time] is encoded as a JSON string containing the timestamp
|
|
// formatted in RFC 3339 with nanosecond precision.
|
|
// If the format matches one of the format constants declared
|
|
// in the time package (e.g., RFC1123), then that format is used.
|
|
// If the format is "unix", "unixmilli", "unixmicro", or "unixnano",
|
|
// then the timestamp is encoded as a possibly fractional JSON number
|
|
// of the number of seconds (or milliseconds, microseconds, or nanoseconds)
|
|
// since the Unix epoch, which is January 1st, 1970 at 00:00:00 UTC.
|
|
// To avoid a fractional component, round the timestamp to the relevant unit.
|
|
// Otherwise, the format is used as-is with [time.Time.Format] if non-empty.
|
|
//
|
|
// - A Go [time.Duration] currently has no default representation and
|
|
// requires an explicit format to be specified.
|
|
// If the format is "sec", "milli", "micro", or "nano",
|
|
// then the duration is encoded as a possibly fractional JSON number
|
|
// of the number of seconds (or milliseconds, microseconds, or nanoseconds).
|
|
// To avoid a fractional component, round the duration to the relevant unit.
|
|
// If the format is "units", it is encoded as a JSON string formatted using
|
|
// [time.Duration.String] (e.g., "1h30m" for 1 hour 30 minutes).
|
|
// If the format is "iso8601", it is encoded as a JSON string using the
|
|
// ISO 8601 standard for durations (e.g., "PT1H30M" for 1 hour 30 minutes)
|
|
// using only accurate units of hours, minutes, and seconds.
|
|
//
|
|
// - All other Go types (e.g., complex numbers, channels, and functions)
|
|
// have no default representation and result in a [SemanticError].
|
|
//
|
|
// JSON cannot represent cyclic data structures and Marshal does not handle them.
|
|
// Passing cyclic structures will result in an error.
|
|
func Marshal(in any, opts ...Options) (out []byte, err error) {
|
|
return json.Marshal(in, opts...)
|
|
}
|
|
|
|
// MarshalWrite serializes a Go value into an [io.Writer] according to the provided
|
|
// marshal and encode options (while ignoring unmarshal or decode options).
|
|
// It does not terminate the output with a newline.
|
|
// See [Marshal] for details about the conversion of a Go value into JSON.
|
|
func MarshalWrite(out io.Writer, in any, opts ...Options) (err error) {
|
|
return json.MarshalWrite(out, in, opts...)
|
|
}
|
|
|
|
// MarshalEncode serializes a Go value into an [jsontext.Encoder] according to
|
|
// the provided marshal options (while ignoring unmarshal, encode, or decode options).
|
|
// Any marshal-relevant options already specified on the [jsontext.Encoder]
|
|
// take lower precedence than the set of options provided by the caller.
|
|
// Unlike [Marshal] and [MarshalWrite], encode options are ignored because
|
|
// they must have already been specified on the provided [jsontext.Encoder].
|
|
//
|
|
// See [Marshal] for details about the conversion of a Go value into JSON.
|
|
func MarshalEncode(out *jsontext.Encoder, in any, opts ...Options) (err error) {
|
|
return json.MarshalEncode(out, in, opts...)
|
|
}
|
|
|
|
// Unmarshal decodes a []byte input into a Go value according to the provided
|
|
// unmarshal and decode options (while ignoring marshal or encode options).
|
|
// The input must be a single JSON value with optional whitespace interspersed.
|
|
// The output must be a non-nil pointer.
|
|
//
|
|
// Type-specific unmarshal functions and methods take precedence
|
|
// over the default representation of a value.
|
|
// Functions or methods that operate on *T are only called when decoding
|
|
// a value of type T (by taking its address) or a non-nil value of *T.
|
|
// Unmarshal ensures that a value is always addressable
|
|
// (by boxing it on the heap if necessary) so that
|
|
// these functions and methods can be consistently called.
|
|
//
|
|
// The input is decoded into the output according the following rules:
|
|
//
|
|
// - If any type-specific functions in a [WithUnmarshalers] option match
|
|
// the value type, then those functions are called to decode the JSON
|
|
// value. If all applicable functions return [SkipFunc],
|
|
// then the input is decoded according to subsequent rules.
|
|
//
|
|
// - If the value type implements [UnmarshalerFrom],
|
|
// then the UnmarshalJSONFrom method is called to decode the JSON value.
|
|
//
|
|
// - If the value type implements [Unmarshaler],
|
|
// then the UnmarshalJSON method is called to decode the JSON value.
|
|
//
|
|
// - If the value type implements [encoding.TextUnmarshaler],
|
|
// then the input is decoded as a JSON string and
|
|
// the UnmarshalText method is called with the decoded string value.
|
|
// This fails with a [SemanticError] if the input is not a JSON string.
|
|
//
|
|
// - Otherwise, the JSON value is decoded according to the value's type
|
|
// as described in detail below.
|
|
//
|
|
// Most Go types have a default JSON representation.
|
|
// Certain types support specialized formatting according to
|
|
// a format flag optionally specified in the Go struct tag
|
|
// for the struct field that contains the current value
|
|
// (see the “JSON Representation of Go structs” section for more details).
|
|
// A JSON null may be decoded into every supported Go value where
|
|
// it is equivalent to storing the zero value of the Go value.
|
|
// If the input JSON kind is not handled by the current Go value type,
|
|
// then this fails with a [SemanticError]. Unless otherwise specified,
|
|
// the decoded value replaces any pre-existing value.
|
|
//
|
|
// The representation of each type is as follows:
|
|
//
|
|
// - A Go boolean is decoded from a JSON boolean (e.g., true or false).
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go string is decoded from a JSON string.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go []byte or [N]byte is decoded from a JSON string
|
|
// containing the binary value encoded using RFC 4648.
|
|
// If the format is "base64" or unspecified, then this uses RFC 4648, section 4.
|
|
// If the format is "base64url", then this uses RFC 4648, section 5.
|
|
// If the format is "base32", then this uses RFC 4648, section 6.
|
|
// If the format is "base32hex", then this uses RFC 4648, section 7.
|
|
// If the format is "base16" or "hex", then this uses RFC 4648, section 8.
|
|
// If the format is "array", then the Go slice or array is decoded from a
|
|
// JSON array where each JSON element is recursively decoded for each byte.
|
|
// When decoding into a non-nil []byte, the slice length is reset to zero
|
|
// and the decoded input is appended to it.
|
|
// When decoding into a [N]byte, the input must decode to exactly N bytes,
|
|
// otherwise it fails with a [SemanticError].
|
|
//
|
|
// - A Go integer is decoded from a JSON number.
|
|
// It must be decoded from a JSON string containing a JSON number
|
|
// if [StringifyNumbers] is specified or decoding a JSON object name.
|
|
// It fails with a [SemanticError] if the JSON number
|
|
// has a fractional or exponent component.
|
|
// It also fails if it overflows the representation of the Go integer type.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go float is decoded from a JSON number.
|
|
// It must be decoded from a JSON string containing a JSON number
|
|
// if [StringifyNumbers] is specified or decoding a JSON object name.
|
|
// It fails if it overflows the representation of the Go float type.
|
|
// If the format is "nonfinite", then the JSON strings
|
|
// "NaN", "Infinity", and "-Infinity" are decoded as NaN, +Inf, and -Inf.
|
|
// Otherwise, the presence of such strings results in a [SemanticError].
|
|
//
|
|
// - A Go map is decoded from a JSON object,
|
|
// where each JSON object name and value pair is recursively decoded
|
|
// as the Go map key and value. Maps are not cleared.
|
|
// If the Go map is nil, then a new map is allocated to decode into.
|
|
// If the decoded key matches an existing Go map entry, the entry value
|
|
// is reused by decoding the JSON object value into it.
|
|
// The formats "emitnull" and "emitempty" have no effect when decoding.
|
|
//
|
|
// - A Go struct is decoded from a JSON object.
|
|
// See the “JSON Representation of Go structs” section
|
|
// in the package-level documentation for more details.
|
|
//
|
|
// - A Go slice is decoded from a JSON array, where each JSON element
|
|
// is recursively decoded and appended to the Go slice.
|
|
// Before appending into a Go slice, a new slice is allocated if it is nil,
|
|
// otherwise the slice length is reset to zero.
|
|
// The formats "emitnull" and "emitempty" have no effect when decoding.
|
|
//
|
|
// - A Go array is decoded from a JSON array, where each JSON array element
|
|
// is recursively decoded as each corresponding Go array element.
|
|
// Each Go array element is zeroed before decoding into it.
|
|
// It fails with a [SemanticError] if the JSON array does not contain
|
|
// the exact same number of elements as the Go array.
|
|
// It does not support any custom format flags.
|
|
//
|
|
// - A Go pointer is decoded based on the JSON kind and underlying Go type.
|
|
// If the input is a JSON null, then this stores a nil pointer.
|
|
// Otherwise, it allocates a new underlying value if the pointer is nil,
|
|
// and recursively JSON decodes into the underlying value.
|
|
// Format flags are forwarded to the decoding of the underlying type.
|
|
//
|
|
// - A Go interface is decoded based on the JSON kind and underlying Go type.
|
|
// If the input is a JSON null, then this stores a nil interface value.
|
|
// Otherwise, a nil interface value of an empty interface type is initialized
|
|
// with a zero Go bool, string, float64, map[string]any, or []any if the
|
|
// input is a JSON boolean, string, number, object, or array, respectively.
|
|
// If the interface value is still nil, then this fails with a [SemanticError]
|
|
// since decoding could not determine an appropriate Go type to decode into.
|
|
// For example, unmarshaling into a nil io.Reader fails since
|
|
// there is no concrete type to populate the interface value with.
|
|
// Otherwise an underlying value exists and it recursively decodes
|
|
// the JSON input into it. It does not support any custom format flags.
|
|
//
|
|
// - A Go [time.Time] is decoded from a JSON string containing the time
|
|
// formatted in RFC 3339 with nanosecond precision.
|
|
// If the format matches one of the format constants declared in
|
|
// the time package (e.g., RFC1123), then that format is used for parsing.
|
|
// If the format is "unix", "unixmilli", "unixmicro", or "unixnano",
|
|
// then the timestamp is decoded from an optionally fractional JSON number
|
|
// of the number of seconds (or milliseconds, microseconds, or nanoseconds)
|
|
// since the Unix epoch, which is January 1st, 1970 at 00:00:00 UTC.
|
|
// Otherwise, the format is used as-is with [time.Time.Parse] if non-empty.
|
|
//
|
|
// - A Go [time.Duration] currently has no default representation and
|
|
// requires an explicit format to be specified.
|
|
// If the format is "sec", "milli", "micro", or "nano",
|
|
// then the duration is decoded from an optionally fractional JSON number
|
|
// of the number of seconds (or milliseconds, microseconds, or nanoseconds).
|
|
// If the format is "units", it is decoded from a JSON string parsed using
|
|
// [time.ParseDuration] (e.g., "1h30m" for 1 hour 30 minutes).
|
|
// If the format is "iso8601", it is decoded from a JSON string using the
|
|
// ISO 8601 standard for durations (e.g., "PT1H30M" for 1 hour 30 minutes)
|
|
// accepting only accurate units of hours, minutes, or seconds.
|
|
//
|
|
// - All other Go types (e.g., complex numbers, channels, and functions)
|
|
// have no default representation and result in a [SemanticError].
|
|
//
|
|
// In general, unmarshaling follows merge semantics (similar to RFC 7396)
|
|
// where the decoded Go value replaces the destination value
|
|
// for any JSON kind other than an object.
|
|
// For JSON objects, the input object is merged into the destination value
|
|
// where matching object members recursively apply merge semantics.
|
|
func Unmarshal(in []byte, out any, opts ...Options) (err error) {
|
|
return json.Unmarshal(in, out, opts...)
|
|
}
|
|
|
|
// UnmarshalRead deserializes a Go value from an [io.Reader] according to the
|
|
// provided unmarshal and decode options (while ignoring marshal or encode options).
|
|
// The input must be a single JSON value with optional whitespace interspersed.
|
|
// It consumes the entirety of [io.Reader] until [io.EOF] is encountered,
|
|
// without reporting an error for EOF. The output must be a non-nil pointer.
|
|
// See [Unmarshal] for details about the conversion of JSON into a Go value.
|
|
func UnmarshalRead(in io.Reader, out any, opts ...Options) (err error) {
|
|
return json.UnmarshalRead(in, out, opts...)
|
|
}
|
|
|
|
// UnmarshalDecode deserializes a Go value from a [jsontext.Decoder] according to
|
|
// the provided unmarshal options (while ignoring marshal, encode, or decode options).
|
|
// Any unmarshal options already specified on the [jsontext.Decoder]
|
|
// take lower precedence than the set of options provided by the caller.
|
|
// Unlike [Unmarshal] and [UnmarshalRead], decode options are ignored because
|
|
// they must have already been specified on the provided [jsontext.Decoder].
|
|
//
|
|
// The input may be a stream of one or more JSON values,
|
|
// where this only unmarshals the next JSON value in the stream.
|
|
// The output must be a non-nil pointer.
|
|
// See [Unmarshal] for details about the conversion of JSON into a Go value.
|
|
func UnmarshalDecode(in *jsontext.Decoder, out any, opts ...Options) (err error) {
|
|
return json.UnmarshalDecode(in, out, opts...)
|
|
}
|
|
|
|
// SkipFunc may be returned by [MarshalToFunc] and [UnmarshalFromFunc] functions.
|
|
//
|
|
// Any function that returns SkipFunc must not cause observable side effects
|
|
// on the provided [jsontext.Encoder] or [jsontext.Decoder].
|
|
// For example, it is permissible to call [jsontext.Decoder.PeekKind],
|
|
// but not permissible to call [jsontext.Decoder.ReadToken] or
|
|
// [jsontext.Encoder.WriteToken] since such methods mutate the state.
|
|
var SkipFunc = json.SkipFunc
|
|
|
|
// Marshalers is a list of functions that may override the marshal behavior
|
|
// of specific types. Populate [WithMarshalers] to use it with
|
|
// [Marshal], [MarshalWrite], or [MarshalEncode].
|
|
// A nil *Marshalers is equivalent to an empty list.
|
|
// There are no exported fields or methods on Marshalers.
|
|
type Marshalers = json.Marshalers
|
|
|
|
// JoinMarshalers constructs a flattened list of marshal functions.
|
|
// If multiple functions in the list are applicable for a value of a given type,
|
|
// then those earlier in the list take precedence over those that come later.
|
|
// If a function returns [SkipFunc], then the next applicable function is called,
|
|
// otherwise the default marshaling behavior is used.
|
|
//
|
|
// For example:
|
|
//
|
|
// m1 := JoinMarshalers(f1, f2)
|
|
// m2 := JoinMarshalers(f0, m1, f3) // equivalent to m3
|
|
// m3 := JoinMarshalers(f0, f1, f2, f3) // equivalent to m2
|
|
func JoinMarshalers(ms ...*Marshalers) *Marshalers {
|
|
return json.JoinMarshalers(ms...)
|
|
}
|
|
|
|
// Unmarshalers is a list of functions that may override the unmarshal behavior
|
|
// of specific types. Populate [WithUnmarshalers] to use it with
|
|
// [Unmarshal], [UnmarshalRead], or [UnmarshalDecode].
|
|
// A nil *Unmarshalers is equivalent to an empty list.
|
|
// There are no exported fields or methods on Unmarshalers.
|
|
type Unmarshalers = json.Unmarshalers
|
|
|
|
// JoinUnmarshalers constructs a flattened list of unmarshal functions.
|
|
// If multiple functions in the list are applicable for a value of a given type,
|
|
// then those earlier in the list take precedence over those that come later.
|
|
// If a function returns [SkipFunc], then the next applicable function is called,
|
|
// otherwise the default unmarshaling behavior is used.
|
|
//
|
|
// For example:
|
|
//
|
|
// u1 := JoinUnmarshalers(f1, f2)
|
|
// u2 := JoinUnmarshalers(f0, u1, f3) // equivalent to u3
|
|
// u3 := JoinUnmarshalers(f0, f1, f2, f3) // equivalent to u2
|
|
func JoinUnmarshalers(us ...*Unmarshalers) *Unmarshalers {
|
|
return json.JoinUnmarshalers(us...)
|
|
}
|
|
|
|
// MarshalFunc constructs a type-specific marshaler that
|
|
// specifies how to marshal values of type T.
|
|
// T can be any type except a named pointer.
|
|
// The function is always provided with a non-nil pointer value
|
|
// if T is an interface or pointer type.
|
|
//
|
|
// The function must marshal exactly one JSON value.
|
|
// The value of T must not be retained outside the function call.
|
|
// It may not return [SkipFunc].
|
|
func MarshalFunc[T any](fn func(T) ([]byte, error)) *Marshalers {
|
|
return json.MarshalFunc[T](fn)
|
|
}
|
|
|
|
// MarshalToFunc constructs a type-specific marshaler that
|
|
// specifies how to marshal values of type T.
|
|
// T can be any type except a named pointer.
|
|
// The function is always provided with a non-nil pointer value
|
|
// if T is an interface or pointer type.
|
|
//
|
|
// The function must marshal exactly one JSON value by calling write methods
|
|
// on the provided encoder. It may return [SkipFunc] such that marshaling can
|
|
// move on to the next marshal function. However, no mutable method calls may
|
|
// be called on the encoder if [SkipFunc] is returned.
|
|
// The pointer to [jsontext.Encoder] and the value of T
|
|
// must not be retained outside the function call.
|
|
func MarshalToFunc[T any](fn func(*jsontext.Encoder, T) error) *Marshalers {
|
|
return json.MarshalToFunc[T](fn)
|
|
}
|
|
|
|
// UnmarshalFunc constructs a type-specific unmarshaler that
|
|
// specifies how to unmarshal values of type T.
|
|
// T must be an unnamed pointer or an interface type.
|
|
// The function is always provided with a non-nil pointer value.
|
|
//
|
|
// The function must unmarshal exactly one JSON value.
|
|
// The input []byte must not be mutated.
|
|
// The input []byte and value T must not be retained outside the function call.
|
|
// It may not return [SkipFunc].
|
|
func UnmarshalFunc[T any](fn func([]byte, T) error) *Unmarshalers {
|
|
return json.UnmarshalFunc[T](fn)
|
|
}
|
|
|
|
// UnmarshalFromFunc constructs a type-specific unmarshaler that
|
|
// specifies how to unmarshal values of type T.
|
|
// T must be an unnamed pointer or an interface type.
|
|
// The function is always provided with a non-nil pointer value.
|
|
//
|
|
// The function must unmarshal exactly one JSON value by calling read methods
|
|
// on the provided decoder. It may return [SkipFunc] such that unmarshaling can
|
|
// move on to the next unmarshal function. However, no mutable method calls may
|
|
// be called on the decoder if [SkipFunc] is returned.
|
|
// The pointer to [jsontext.Decoder] and the value of T
|
|
// must not be retained outside the function call.
|
|
func UnmarshalFromFunc[T any](fn func(*jsontext.Decoder, T) error) *Unmarshalers {
|
|
return json.UnmarshalFromFunc[T](fn)
|
|
}
|
|
|
|
// Marshaler is implemented by types that can marshal themselves.
|
|
// It is recommended that types implement [MarshalerTo] unless the implementation
|
|
// is trying to avoid a hard dependency on the "jsontext" package.
|
|
//
|
|
// It is recommended that implementations return a buffer that is safe
|
|
// for the caller to retain and potentially mutate.
|
|
type Marshaler = json.Marshaler
|
|
|
|
// MarshalerTo is implemented by types that can marshal themselves.
|
|
// It is recommended that types implement MarshalerTo instead of [Marshaler]
|
|
// since this is both more performant and flexible.
|
|
// If a type implements both Marshaler and MarshalerTo,
|
|
// then MarshalerTo takes precedence. In such a case, both implementations
|
|
// should aim to have equivalent behavior for the default marshal options.
|
|
//
|
|
// The implementation must write only one JSON value to the Encoder and
|
|
// must not retain the pointer to [jsontext.Encoder].
|
|
type MarshalerTo = json.MarshalerTo
|
|
|
|
// Unmarshaler is implemented by types that can unmarshal themselves.
|
|
// It is recommended that types implement [UnmarshalerFrom] unless the implementation
|
|
// is trying to avoid a hard dependency on the "jsontext" package.
|
|
//
|
|
// The input can be assumed to be a valid encoding of a JSON value
|
|
// if called from unmarshal functionality in this package.
|
|
// UnmarshalJSON must copy the JSON data if it is retained after returning.
|
|
// It is recommended that UnmarshalJSON implement merge semantics when
|
|
// unmarshaling into a pre-populated value.
|
|
//
|
|
// Implementations must not retain or mutate the input []byte.
|
|
type Unmarshaler = json.Unmarshaler
|
|
|
|
// UnmarshalerFrom is implemented by types that can unmarshal themselves.
|
|
// It is recommended that types implement UnmarshalerFrom instead of [Unmarshaler]
|
|
// since this is both more performant and flexible.
|
|
// If a type implements both Unmarshaler and UnmarshalerFrom,
|
|
// then UnmarshalerFrom takes precedence. In such a case, both implementations
|
|
// should aim to have equivalent behavior for the default unmarshal options.
|
|
//
|
|
// The implementation must read only one JSON value from the Decoder.
|
|
// It is recommended that UnmarshalJSONFrom implement merge semantics when
|
|
// unmarshaling into a pre-populated value.
|
|
//
|
|
// Implementations must not retain the pointer to [jsontext.Decoder].
|
|
type UnmarshalerFrom = json.UnmarshalerFrom
|
|
|
|
// ErrUnknownName indicates that a JSON object member could not be
|
|
// unmarshaled because the name is not known to the target Go struct.
|
|
// This error is directly wrapped within a [SemanticError] when produced.
|
|
//
|
|
// The name of an unknown JSON object member can be extracted as:
|
|
//
|
|
// err := ...
|
|
// var serr json.SemanticError
|
|
// if errors.As(err, &serr) && serr.Err == json.ErrUnknownName {
|
|
// ptr := serr.JSONPointer // JSON pointer to unknown name
|
|
// name := ptr.LastToken() // unknown name itself
|
|
// ...
|
|
// }
|
|
//
|
|
// This error is only returned if [RejectUnknownMembers] is true.
|
|
var ErrUnknownName = json.ErrUnknownName
|
|
|
|
// SemanticError describes an error determining the meaning
|
|
// of JSON data as Go data or vice-versa.
|
|
//
|
|
// The contents of this error as produced by this package may change over time.
|
|
type SemanticError = json.SemanticError
|
|
|
|
// Options configure [Marshal], [MarshalWrite], [MarshalEncode],
|
|
// [Unmarshal], [UnmarshalRead], and [UnmarshalDecode] with specific features.
|
|
// Each function takes in a variadic list of options, where properties
|
|
// set in later options override the value of previously set properties.
|
|
//
|
|
// The Options type is identical to [encoding/json.Options] and
|
|
// [encoding/json/jsontext.Options]. Options from the other packages can
|
|
// be used interchangeably with functionality in this package.
|
|
//
|
|
// Options represent either a singular option or a set of options.
|
|
// It can be functionally thought of as a Go map of option properties
|
|
// (even though the underlying implementation avoids Go maps for performance).
|
|
//
|
|
// The constructors (e.g., [Deterministic]) return a singular option value:
|
|
//
|
|
// opt := Deterministic(true)
|
|
//
|
|
// which is analogous to creating a single entry map:
|
|
//
|
|
// opt := Options{"Deterministic": true}
|
|
//
|
|
// [JoinOptions] composes multiple options values to together:
|
|
//
|
|
// out := JoinOptions(opts...)
|
|
//
|
|
// which is analogous to making a new map and copying the options over:
|
|
//
|
|
// out := make(Options)
|
|
// for _, m := range opts {
|
|
// for k, v := range m {
|
|
// out[k] = v
|
|
// }
|
|
// }
|
|
//
|
|
// [GetOption] looks up the value of options parameter:
|
|
//
|
|
// v, ok := GetOption(opts, Deterministic)
|
|
//
|
|
// which is analogous to a Go map lookup:
|
|
//
|
|
// v, ok := Options["Deterministic"]
|
|
//
|
|
// There is a single Options type, which is used with both marshal and unmarshal.
|
|
// Some options affect both operations, while others only affect one operation:
|
|
//
|
|
// - [StringifyNumbers] affects marshaling and unmarshaling
|
|
// - [Deterministic] affects marshaling only
|
|
// - [FormatNilSliceAsNull] affects marshaling only
|
|
// - [FormatNilMapAsNull] affects marshaling only
|
|
// - [OmitZeroStructFields] affects marshaling only
|
|
// - [MatchCaseInsensitiveNames] affects marshaling and unmarshaling
|
|
// - [DiscardUnknownMembers] affects marshaling only
|
|
// - [RejectUnknownMembers] affects unmarshaling only
|
|
// - [WithMarshalers] affects marshaling only
|
|
// - [WithUnmarshalers] affects unmarshaling only
|
|
//
|
|
// Options that do not affect a particular operation are ignored.
|
|
type Options = json.Options
|
|
|
|
// JoinOptions coalesces the provided list of options into a single Options.
|
|
// Properties set in later options override the value of previously set properties.
|
|
func JoinOptions(srcs ...Options) Options {
|
|
return json.JoinOptions(srcs...)
|
|
}
|
|
|
|
// GetOption returns the value stored in opts with the provided setter,
|
|
// reporting whether the value is present.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// v, ok := json.GetOption(opts, json.Deterministic)
|
|
//
|
|
// Options are most commonly introspected to alter the JSON representation of
|
|
// [MarshalerTo.MarshalJSONTo] and [UnmarshalerFrom.UnmarshalJSONFrom] methods, and
|
|
// [MarshalToFunc] and [UnmarshalFromFunc] functions.
|
|
// In such cases, the presence bit should generally be ignored.
|
|
func GetOption[T any](opts Options, setter func(T) Options) (T, bool) {
|
|
return json.GetOption[T](opts, setter)
|
|
}
|
|
|
|
// DefaultOptionsV2 is the full set of all options that define v2 semantics.
|
|
// It is equivalent to all options under [Options], [encoding/json.Options],
|
|
// and [encoding/json/jsontext.Options] being set to false or the zero value,
|
|
// except for the options related to whitespace formatting.
|
|
func DefaultOptionsV2() Options {
|
|
return json.DefaultOptionsV2()
|
|
}
|
|
|
|
// StringifyNumbers specifies that numeric Go types should be marshaled
|
|
// as a JSON string containing the equivalent JSON number value.
|
|
// When unmarshaling, numeric Go types are parsed from a JSON string
|
|
// containing the JSON number without any surrounding whitespace.
|
|
//
|
|
// According to RFC 8259, section 6, a JSON implementation may choose to
|
|
// limit the representation of a JSON number to an IEEE 754 binary64 value.
|
|
// This may cause decoders to lose precision for int64 and uint64 types.
|
|
// Quoting JSON numbers as a JSON string preserves the exact precision.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
func StringifyNumbers(v bool) Options {
|
|
return json.StringifyNumbers(v)
|
|
}
|
|
|
|
// Deterministic specifies that the same input value will be serialized
|
|
// as the exact same output bytes. Different processes of
|
|
// the same program will serialize equal values to the same bytes,
|
|
// but different versions of the same program are not guaranteed
|
|
// to produce the exact same sequence of bytes.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func Deterministic(v bool) Options {
|
|
return json.Deterministic(v)
|
|
}
|
|
|
|
// FormatNilSliceAsNull specifies that a nil Go slice should marshal as a
|
|
// JSON null instead of the default representation as an empty JSON array
|
|
// (or an empty JSON string in the case of ~[]byte).
|
|
// Slice fields explicitly marked with `format:emitempty` still marshal
|
|
// as an empty JSON array.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func FormatNilSliceAsNull(v bool) Options {
|
|
return json.FormatNilSliceAsNull(v)
|
|
}
|
|
|
|
// FormatNilMapAsNull specifies that a nil Go map should marshal as a
|
|
// JSON null instead of the default representation as an empty JSON object.
|
|
// Map fields explicitly marked with `format:emitempty` still marshal
|
|
// as an empty JSON object.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func FormatNilMapAsNull(v bool) Options {
|
|
return json.FormatNilMapAsNull(v)
|
|
}
|
|
|
|
// OmitZeroStructFields specifies that a Go struct should marshal in such a way
|
|
// that all struct fields that are zero are omitted from the marshaled output
|
|
// if the value is zero as determined by the "IsZero() bool" method if present,
|
|
// otherwise based on whether the field is the zero Go value.
|
|
// This is semantically equivalent to specifying the `omitzero` tag option
|
|
// on every field in a Go struct.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func OmitZeroStructFields(v bool) Options {
|
|
return json.OmitZeroStructFields(v)
|
|
}
|
|
|
|
// MatchCaseInsensitiveNames specifies that JSON object members are matched
|
|
// against Go struct fields using a case-insensitive match of the name.
|
|
// Go struct fields explicitly marked with `case:strict` or `case:ignore`
|
|
// always use case-sensitive (or case-insensitive) name matching,
|
|
// regardless of the value of this option.
|
|
//
|
|
// This affects either marshaling or unmarshaling.
|
|
// For marshaling, this option may alter the detection of duplicate names
|
|
// (assuming [jsontext.AllowDuplicateNames] is false) from inlined fields
|
|
// if it matches one of the declared fields in the Go struct.
|
|
func MatchCaseInsensitiveNames(v bool) Options {
|
|
return json.MatchCaseInsensitiveNames(v)
|
|
}
|
|
|
|
// DiscardUnknownMembers specifies that marshaling should ignore any
|
|
// JSON object members stored in Go struct fields dedicated to storing
|
|
// unknown JSON object members.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func DiscardUnknownMembers(v bool) Options {
|
|
return json.DiscardUnknownMembers(v)
|
|
}
|
|
|
|
// RejectUnknownMembers specifies that unknown members should be rejected
|
|
// when unmarshaling a JSON object, regardless of whether there is a field
|
|
// to store unknown members.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
func RejectUnknownMembers(v bool) Options {
|
|
return json.RejectUnknownMembers(v)
|
|
}
|
|
|
|
// WithMarshalers specifies a list of type-specific marshalers to use,
|
|
// which can be used to override the default marshal behavior for values
|
|
// of particular types.
|
|
//
|
|
// This only affects marshaling and is ignored when unmarshaling.
|
|
func WithMarshalers(v *Marshalers) Options {
|
|
return json.WithMarshalers(v)
|
|
}
|
|
|
|
// WithUnmarshalers specifies a list of type-specific unmarshalers to use,
|
|
// which can be used to override the default unmarshal behavior for values
|
|
// of particular types.
|
|
//
|
|
// This only affects unmarshaling and is ignored when marshaling.
|
|
func WithUnmarshalers(v *Unmarshalers) Options {
|
|
return json.WithUnmarshalers(v)
|
|
}
|