jsonopts

package standard library
go1.27rc1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 18, 2026 License: BSD-3-Clause Imports: 2 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultOptionsV1 = Struct{
	Flags: jsonflags.Flags{
		Presence: uint64(jsonflags.DefaultV1Flags),
		Values:   uint64(jsonflags.DefaultV1Flags),
	},
}

DefaultOptionsV1 is the set of all options that define default v1 behavior.

View Source
var DefaultOptionsV2 = Struct{
	Flags: jsonflags.Flags{
		Presence: uint64(jsonflags.DefaultV1Flags),
		Values:   uint64(0),
	},
}

DefaultOptionsV2 is the set of all options that define default v2 behavior.

View Source
var GetUnknownOption = func(Struct, Options) (any, bool) { panic("unknown option") }

GetUnknownOption is injected by the "json" package to handle Options declared in that package so that "jsonopts" can handle them.

View Source
var JoinUnknownOption = func(Struct, Options) Struct { panic("unknown option") }

JoinUnknownOption is injected by the "json" package to handle Options declared in that package so that "jsonopts" can handle them.

Functions

func ChangedWhitespace

func ChangedWhitespace(s1, s2 Struct) bool

ChangedWhitespace reports whether whitespace values have changed.

func GetOption

func GetOption[T any](opts Options, setter func(T) Options) (T, bool)

Types

type ArshalValues

type ArshalValues struct {
	Marshalers   any // jsonflags.Marshalers
	Unmarshalers any // jsonflags.Unmarshalers

	Format string // valid if jsonflags.FormatTag is set
}

type ByteLimit

type ByteLimit int64 // jsontext.WithByteLimit

func (ByteLimit) JSONOptions

func (ByteLimit) JSONOptions(internal.NotForPublicUse)

type CoderValues

type CoderValues struct {
	Indent       string // jsonflags.Indent
	IndentPrefix string // jsonflags.IndentPrefix
	ByteLimit    int64  // jsonflags.ByteLimit
	DepthLimit   int    // jsonflags.DepthLimit
}

type DepthLimit

type DepthLimit int // jsontext.WithDepthLimit

func (DepthLimit) JSONOptions

func (DepthLimit) JSONOptions(internal.NotForPublicUse)

type Indent

type Indent string // jsontext.WithIndent

func (Indent) JSONOptions

func (Indent) JSONOptions(internal.NotForPublicUse)

type IndentPrefix

type IndentPrefix string // jsontext.WithIndentPrefix

func (IndentPrefix) JSONOptions

func (IndentPrefix) JSONOptions(internal.NotForPublicUse)

type Options

type Options interface {
	// JSONOptions is exported so related json packages can implement Options.
	JSONOptions(internal.NotForPublicUse)
}

Options is the common options type shared across json packages.

func ExperimentalSupportFormatTag

func ExperimentalSupportFormatTag(v bool) Options

ExperimentalSupportFormatTag enables support for the `format` tag.

WARNING: This is an experimental feature and will be removed in the future as either a failed experiment or be formally included in "encoding/json/v2" in some semantically similar form, in which case, users of this option must migrate to the officially supported feature.

The `format` tag was originally part of the "encoding/json/v2" experiment but support for it was removed (see https://go.dev/issue/79071) for the initial release of "encoding/json/v2" in light of the anticipation that the Go language might support typed struct tags (https://go.dev/issue/74472).

Typed struct tags are a more expressive and type-safe way to express format attributes than the bespoke `format` tag option that implements a miniature domain-specific language (DSL) within the "json" package itself.

While "encoding/json/v2" was in the experimental phase, some users were already depending on the `format` tag option. This experimental option exists to provide a temporary workaround until the (hopeful) inclusion of typed struct tags and support for formatting directives in "encoding/json/v2" using that language mechanism.

This option enables support for the `format` tag option, which 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.

Go types with alternative representations are as follows:

  • A Go []byte or [N]byte is usually represented 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 represented as a JSON array where each element recursively uses the JSON representation of each byte.

  • A Go float is usually represented as a JSON number. If the format is "nonfinite", then NaN, +Inf, and -Inf are represented as the JSON strings "NaN", "Infinity", and "-Infinity", respectively. Without the use of this format, such string values result in a [SemanticError].

  • A nil Go map is usually encoded using an empty JSON object. 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.

  • A nil Go slice is usually encoded using an empty 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.

  • A Go pointer usually uses the JSON representation of the underlying value. The format is forwarded to the marshaling and unmarshaling of the underlying type.

  • A Go time.Time is usually represented 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 represented 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 when encoding, round the timestamp to the relevant unit. Otherwise if non-empty, the format is used as-is and encoded using time.Time.Format and decoded using time.Time.Parse.

  • A Go time.Duration usually has no default representation. If the format is "sec", "milli", "micro", or "nano", then the duration is represented as a possibly fractional JSON number of the number of seconds (or milliseconds, microseconds, or nanoseconds). To avoid a fractional component when encoding, round the duration to the relevant unit. If the format is "units", it is represented as a JSON string encoded using time.Duration.String and decoded using time.ParseDuration (e.g., "1h30m" for 1 hour 30 minutes). If the format is "iso8601", it is represented 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.

type Struct

type Struct struct {
	Flags jsonflags.Flags

	CoderValues
	ArshalValues
}

Struct is the combination of all options in struct form. This is efficient to pass down the call stack and to query.

func (*Struct) InitializeMultiline

func (s *Struct) InitializeMultiline()

InitializeMultiline sets default options implied by Multiline.

func (*Struct) JSONOptions

func (*Struct) JSONOptions(internal.NotForPublicUse)

func (*Struct) Join

func (dst *Struct) Join(srcs ...Options)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL