k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/internal/third_party/go-json-experiment/json/doc.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package json implements serialization of JSON 6 // as specified in RFC 4627, RFC 7159, RFC 7493, RFC 8259, and RFC 8785. 7 // JSON is a simple data interchange format that can represent 8 // primitive data types such as booleans, strings, and numbers, 9 // in addition to structured data types such as objects and arrays. 10 // 11 // # Terminology 12 // 13 // This package uses the terms "encode" and "decode" for syntactic functionality 14 // that is concerned with processing JSON based on its grammar, and 15 // uses the terms "marshal" and "unmarshal" for semantic functionality 16 // that determines the meaning of JSON values as Go values and vice-versa. 17 // It aims to provide a clear distinction between functionality that 18 // is purely concerned with encoding versus that of marshaling. 19 // For example, one can directly encode a stream of JSON tokens without 20 // needing to marshal a concrete Go value representing them. 21 // Similarly, one can decode a stream of JSON tokens without 22 // needing to unmarshal them into a concrete Go value. 23 // 24 // This package uses JSON terminology when discussing JSON, which may differ 25 // from related concepts in Go or elsewhere in computing literature. 26 // 27 // - A JSON "object" refers to an unordered collection of name/value members. 28 // - A JSON "array" refers to an ordered sequence of elements. 29 // - A JSON "value" refers to either a literal (i.e., null, false, or true), 30 // string, number, object, or array. 31 // 32 // See RFC 8259 for more information. 33 // 34 // # Specifications 35 // 36 // Relevant specifications include RFC 4627, RFC 7159, RFC 7493, RFC 8259, 37 // and RFC 8785. Each RFC is generally a stricter subset of another RFC. 38 // In increasing order of strictness: 39 // 40 // - RFC 4627 and RFC 7159 do not require (but recommend) the use of UTF-8 41 // and also do not require (but recommend) that object names be unique. 42 // - RFC 8259 requires the use of UTF-8, 43 // but does not require (but recommends) that object names be unique. 44 // - RFC 7493 requires the use of UTF-8 45 // and also requires that object names be unique. 46 // - RFC 8785 defines a canonical representation. It requires the use of UTF-8 47 // and also requires that object names be unique and in a specific ordering. 48 // It specifies exactly how strings and numbers must be formatted. 49 // 50 // The primary difference between RFC 4627 and RFC 7159 is that the former 51 // restricted top-level values to only JSON objects and arrays, while 52 // RFC 7159 and subsequent RFCs permit top-level values to additionally be 53 // JSON nulls, booleans, strings, or numbers. 54 // 55 // By default, this package operates on RFC 7493, but can be configured 56 // to operate according to the other RFC specifications. 57 // RFC 7493 is a stricter subset of RFC 8259 and fully compliant with it. 58 // In particular, it makes specific choices about behavior that RFC 8259 59 // leaves as undefined in order to ensure greater interoperability. 60 // 61 // # JSON Representation of Go structs 62 // 63 // A Go struct is naturally represented as a JSON object, 64 // where each Go struct field corresponds with a JSON object member. 65 // When marshaling, all Go struct fields are recursively encoded in depth-first 66 // order as JSON object members except those that are ignored or omitted. 67 // When unmarshaling, JSON object members are recursively decoded 68 // into the corresponding Go struct fields. 69 // Object members that do not match any struct fields, 70 // also known as “unknown members”, are ignored by default or rejected 71 // if UnmarshalOptions.RejectUnknownMembers is specified. 72 // 73 // The representation of each struct field can be customized in the 74 // "json" struct field tag, where the tag is a comma separated list of options. 75 // As a special case, if the entire tag is `json:"-"`, 76 // then the field is ignored with regard to its JSON representation. 77 // 78 // The first option is the JSON object name override for the Go struct field. 79 // If the name is not specified, then the Go struct field name 80 // is used as the JSON object name. JSON names containing commas or quotes, 81 // or names identical to "" or "-", can be specified using 82 // a single-quoted string literal, where the syntax is identical to 83 // the Go grammar for a double-quoted string literal, 84 // but instead uses single quotes as the delimiters. 85 // By default, unmarshaling uses case-sensitive matching to identify 86 // the Go struct field associated with a JSON object name. 87 // 88 // After the name, the following tag options are supported: 89 // 90 // - omitzero: When marshaling, the "omitzero" option specifies that 91 // the struct field should be omitted if the field value is zero 92 // as determined by the "IsZero() bool" method if present, 93 // otherwise based on whether the field is the zero Go value. 94 // This option has no effect when unmarshaling. 95 // 96 // - omitempty: When marshaling, the "omitempty" option specifies that 97 // the struct field should be omitted if the field value would have been 98 // encoded as a JSON null, empty string, empty object, or empty array. 99 // This option has no effect when unmarshaling. 100 // 101 // - string: The "string" option specifies that 102 // MarshalOptions.StringifyNumbers and UnmarshalOptions.StringifyNumbers 103 // be set when marshaling or unmarshaling a struct field value. 104 // This causes numeric types to be encoded as a JSON number 105 // within a JSON string, and to be decoded from either a JSON number or 106 // a JSON string containing a JSON number. 107 // This extra level of encoding is often necessary since 108 // many JSON parsers cannot precisely represent 64-bit integers. 109 // 110 // - nocase: When unmarshaling, the "nocase" option specifies that 111 // if the JSON object name does not exactly match the JSON name 112 // for any of the struct fields, then it attempts to match the struct field 113 // using a case-insensitive match that also ignores dashes and underscores. 114 // If multiple fields match, the first declared field in breadth-first order 115 // takes precedence. This option has no effect when marshaling. 116 // 117 // - inline: The "inline" option specifies that 118 // the JSON representable content of this field type is to be promoted 119 // as if they were specified in the parent struct. 120 // It is the JSON equivalent of Go struct embedding. 121 // A Go embedded field is implicitly inlined unless an explicit JSON name 122 // is specified. The inlined field must be a Go struct 123 // (that does not implement any JSON methods), RawValue, map[string]T, 124 // or an unnamed pointer to such types. When marshaling, 125 // inlined fields from a pointer type are omitted if it is nil. 126 // Inlined fields of type RawValue and map[string]T are called 127 // “inlined fallbacks” as they can represent all possible 128 // JSON object members not directly handled by the parent struct. 129 // Only one inlined fallback field may be specified in a struct, 130 // while many non-fallback fields may be specified. This option 131 // must not be specified with any other option (including the JSON name). 132 // 133 // - unknown: The "unknown" option is a specialized variant 134 // of the inlined fallback to indicate that this Go struct field 135 // contains any number of unknown JSON object members. The field type 136 // must be a RawValue, map[string]T, or an unnamed pointer to such types. 137 // If MarshalOptions.DiscardUnknownMembers is specified when marshaling, 138 // the contents of this field are ignored. 139 // If UnmarshalOptions.RejectUnknownMembers is specified when unmarshaling, 140 // any unknown object members are rejected regardless of whether 141 // an inlined fallback with the "unknown" option exists. This option 142 // must not be specified with any other option (including the JSON name). 143 // 144 // - format: The "format" option specifies a format flag 145 // used to specialize the formatting of the field value. 146 // The option is a key-value pair specified as "format:value" where 147 // the value must be either a literal consisting of letters and numbers 148 // (e.g., "format:RFC3339") or a single-quoted string literal 149 // (e.g., "format:'2006-01-02'"). The interpretation of the format flag 150 // is determined by the struct field type. 151 // 152 // The "omitzero" and "omitempty" options are mostly semantically identical. 153 // The former is defined in terms of the Go type system, 154 // while the latter in terms of the JSON type system. 155 // Consequently they behave differently in some circumstances. 156 // For example, only a nil slice or map is omitted under "omitzero", while 157 // an empty slice or map is omitted under "omitempty" regardless of nilness. 158 // The "omitzero" option is useful for types with a well-defined zero value 159 // (e.g., netip.Addr) or have an IsZero method (e.g., time.Time). 160 // 161 // Every Go struct corresponds to a list of JSON representable fields 162 // which is constructed by performing a breadth-first search over 163 // all struct fields (excluding unexported or ignored fields), 164 // where the search recursively descends into inlined structs. 165 // The set of non-inlined fields in a struct must have unique JSON names. 166 // If multiple fields all have the same JSON name, then the one 167 // at shallowest depth takes precedence and the other fields at deeper depths 168 // are excluded from the list of JSON representable fields. 169 // If multiple fields at the shallowest depth have the same JSON name, 170 // then all of those fields are excluded from the list. This is analogous to 171 // Go visibility rules for struct field selection with embedded struct types. 172 // 173 // Marshaling or unmarshaling a non-empty struct 174 // without any JSON representable fields results in a SemanticError. 175 // Unexported fields must not have any `json` tags except for `json:"-"`. 176 package json 177 178 // requireKeyedLiterals can be embedded in a struct to require keyed literals. 179 type requireKeyedLiterals struct{} 180 181 // nonComparable can be embedded in a struct to prevent comparability. 182 type nonComparable [0]func()