package json
import (
)
func ( *jsontext.Encoder, any, *jsonopts.Struct) error {
switch val := .(type) {
case nil:
return .WriteToken(jsontext.Null)
case bool:
return .WriteToken(jsontext.Bool())
case string:
return .WriteToken(jsontext.String())
case float64:
if math.IsNaN() || math.IsInf(, 0) {
break
}
return .WriteToken(jsontext.Float())
case map[string]any:
return marshalObjectAny(, , )
case []any:
return marshalArrayAny(, , )
}
:= newAddressableValue(reflect.TypeOf())
.Set(reflect.ValueOf())
:= lookupArshaler(.Type()).marshal
if .Marshalers != nil {
, _ = .Marshalers.(*Marshalers).lookup(, .Type())
}
return (, , )
}
func ( *jsontext.Decoder, *jsonopts.Struct) (any, error) {
switch := .PeekKind(); {
case '{':
return unmarshalObjectAny(, )
case '[':
return unmarshalArrayAny(, )
default:
:= export.Decoder()
var jsonwire.ValueFlags
, := .ReadValue(&)
if != nil {
return nil,
}
switch .Kind() {
case 'n':
return nil, nil
case 'f':
return false, nil
case 't':
return true, nil
case '"':
= jsonwire.UnquoteMayCopy(, .IsVerbatim())
if .StringCache == nil {
.StringCache = new(stringCache)
}
return makeString(.StringCache, ), nil
case '0':
if .Flags.Get(jsonflags.UnmarshalAnyWithRawNumber) {
return internal.RawNumberOf(), nil
}
, := strconv.ParseFloat(string(), 64)
if != nil {
return 0.0, newUnmarshalErrorAfterWithValue(, float64Type, errors.Unwrap())
}
return , nil
default:
panic("BUG: invalid kind: " + .String())
}
}
}
func ( *jsontext.Encoder, map[string]any, *jsonopts.Struct) error {
:= export.Encoder()
if .Tokens.Depth() > startDetectingCyclesAfter {
:= reflect.ValueOf()
if := visitPointer(&.SeenPointers, ); != nil {
return newMarshalErrorBefore(, mapStringAnyType, )
}
defer leavePointer(&.SeenPointers, )
}
if len() == 0 {
if .Flags.Get(jsonflags.FormatNilMapAsNull) && == nil {
return .WriteToken(jsontext.Null)
}
if !.Flags.Get(jsonflags.AnyWhitespace) && !.Tokens.Last.NeedObjectName() {
.Buf = append(.Tokens.MayAppendDelim(.Buf, '{'), "{}"...)
.Tokens.Last.Increment()
if .NeedFlush() {
return .Flush()
}
return nil
}
}
if := .WriteToken(jsontext.BeginObject); != nil {
return
}
if !.Flags.Get(jsonflags.AllowInvalidUTF8) {
.Tokens.Last.DisableNamespace()
}
if !.Flags.Get(jsonflags.Deterministic) || len() <= 1 {
for , := range {
if := .WriteToken(jsontext.String()); != nil {
return
}
if := marshalValueAny(, , ); != nil {
return
}
}
} else {
:= getStrings(len())
var int
for := range {
(*)[] =
++
}
slices.Sort(*)
for , := range * {
if := .WriteToken(jsontext.String()); != nil {
return
}
if := marshalValueAny(, [], ); != nil {
return
}
}
putStrings()
}
if := .WriteToken(jsontext.EndObject); != nil {
return
}
return nil
}
func ( *jsontext.Decoder, *jsonopts.Struct) (map[string]any, error) {
switch , := .ReadToken(); {
case != nil:
return nil,
case .Kind() != '{':
panic("BUG: invalid kind: " + .Kind().String())
}
:= make(map[string]any)
if !.Flags.Get(jsonflags.AllowInvalidUTF8) {
export.Decoder().Tokens.Last.DisableNamespace()
}
var error
for .PeekKind() != '}' {
, := .ReadToken()
if != nil {
return ,
}
:= .String()
if , := []; {
:= export.Decoder().PreviousTokenOrValue()
:= newDuplicateNameError(.StackPointer(), nil, .InputOffset()-len64())
return ,
}
, := unmarshalValueAny(, )
[] =
if != nil {
if isFatalError(, .Flags) {
return ,
}
= cmp.Or(, )
}
}
if , := .ReadToken(); != nil {
return ,
}
return ,
}
func ( *jsontext.Encoder, []any, *jsonopts.Struct) error {
:= export.Encoder()
if .Tokens.Depth() > startDetectingCyclesAfter {
:= reflect.ValueOf()
if := visitPointer(&.SeenPointers, ); != nil {
return newMarshalErrorBefore(, sliceAnyType, )
}
defer leavePointer(&.SeenPointers, )
}
if len() == 0 {
if .Flags.Get(jsonflags.FormatNilSliceAsNull) && == nil {
return .WriteToken(jsontext.Null)
}
if !.Flags.Get(jsonflags.AnyWhitespace) && !.Tokens.Last.NeedObjectName() {
.Buf = append(.Tokens.MayAppendDelim(.Buf, '['), "[]"...)
.Tokens.Last.Increment()
if .NeedFlush() {
return .Flush()
}
return nil
}
}
if := .WriteToken(jsontext.BeginArray); != nil {
return
}
for , := range {
if := marshalValueAny(, , ); != nil {
return
}
}
if := .WriteToken(jsontext.EndArray); != nil {
return
}
return nil
}
func ( *jsontext.Decoder, *jsonopts.Struct) ([]any, error) {
switch , := .ReadToken(); {
case != nil:
return nil,
case .Kind() != '[':
panic("BUG: invalid kind: " + .Kind().String())
}
:= []any{}
var error
for .PeekKind() != ']' {
, := unmarshalValueAny(, )
= append(, )
if != nil {
if isFatalError(, .Flags) {
return ,
}
= cmp.Or(, )
}
}
if , := .ReadToken(); != nil {
return ,
}
return ,
}