v.Set(reflect.New(v.Type().Elem()))
}
if v.Type().NumMethod() > 0 && v.CanInterface() {
- if u, ok := v.Interface().(Unmarshaler); ok {
+ if u, ok := reflect.TypeAssert[Unmarshaler](v); ok {
return u, nil, reflect.Value{}
}
if !decodingNull {
- if u, ok := v.Interface().(encoding.TextUnmarshaler); ok {
+ if u, ok := reflect.TypeAssert[encoding.TextUnmarshaler](v); ok {
return nil, u, reflect.Value{}
}
}
e.WriteString("null")
return
}
- m, ok := v.Interface().(Marshaler)
+ m, ok := reflect.TypeAssert[Marshaler](v)
if !ok {
e.WriteString("null")
return
e.WriteString("null")
return
}
- m := va.Interface().(Marshaler)
+ m, _ := reflect.TypeAssert[Marshaler](va)
b, err := m.MarshalJSON()
if err == nil {
e.Grow(len(b))
e.WriteString("null")
return
}
- m, ok := v.Interface().(encoding.TextMarshaler)
+ m, ok := reflect.TypeAssert[encoding.TextMarshaler](v)
if !ok {
e.WriteString("null")
return
e.WriteString("null")
return
}
- m := va.Interface().(encoding.TextMarshaler)
+ m, _ := reflect.TypeAssert[encoding.TextMarshaler](va)
b, err := m.MarshalText()
if err != nil {
e.error(&MarshalerError{v.Type(), err, "MarshalText"})
if k.Kind() == reflect.String {
return k.String(), nil
}
- if tm, ok := k.Interface().(encoding.TextMarshaler); ok {
+ if tm, ok := reflect.TypeAssert[encoding.TextMarshaler](k); ok {
if k.Kind() == reflect.Pointer && k.IsNil() {
return "", nil
}
typFnc := typedMarshaler{
typ: t,
fnc: func(enc *jsontext.Encoder, va addressableValue, mo *jsonopts.Struct) error {
- val, err := fn(va.castTo(t).Interface().(T))
+ v, _ := reflect.TypeAssert[T](va.castTo(t))
+ val, err := fn(v)
if err != nil {
err = wrapSkipFunc(err, "marshal function of type func(T) ([]byte, error)")
if mo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
xe := export.Encoder(enc)
prevDepth, prevLength := xe.Tokens.DepthLength()
xe.Flags.Set(jsonflags.WithinArshalCall | 1)
- err := fn(enc, va.castTo(t).Interface().(T))
+ v, _ := reflect.TypeAssert[T](va.castTo(t))
+ err := fn(enc, v)
xe.Flags.Set(jsonflags.WithinArshalCall | 0)
currDepth, currLength := xe.Tokens.DepthLength()
if err == nil && (prevDepth != currDepth || prevLength+1 != currLength) {
if err != nil {
return err // must be a syntactic or I/O error
}
- err = fn(val, va.castTo(t).Interface().(T))
+ v, _ := reflect.TypeAssert[T](va.castTo(t))
+ err = fn(val, v)
if err != nil {
err = wrapSkipFunc(err, "unmarshal function of type func([]byte, T) error")
if uo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
xd := export.Decoder(dec)
prevDepth, prevLength := xd.Tokens.DepthLength()
xd.Flags.Set(jsonflags.WithinArshalCall | 1)
- err := fn(dec, va.castTo(t).Interface().(T))
+ v, _ := reflect.TypeAssert[T](va.castTo(t))
+ err := fn(dec, v)
xd.Flags.Set(jsonflags.WithinArshalCall | 0)
currDepth, currLength := xd.Tokens.DepthLength()
if err == nil && (prevDepth != currDepth || prevLength+1 != currLength) {
}
if v.Type() == jsontextValueType {
- // TODO(https://go.dev/issue/62121): Use reflect.Value.AssertTo.
- b := *v.Addr().Interface().(*jsontext.Value)
+ b, _ := reflect.TypeAssert[jsontext.Value](v.Value)
if len(b) == 0 { // TODO: Should this be nil? What if it were all whitespace?
return nil
}
v = v.indirect(true)
if v.Type() == jsontextValueType {
- b := v.Addr().Interface().(*jsontext.Value)
+ b, _ := reflect.TypeAssert[*jsontext.Value](v.Addr())
if len(*b) == 0 { // TODO: Should this be nil? What if it were all whitespace?
*b = append(*b, '{')
} else {
(needAddr && va.forcedAddr) {
return prevMarshal(enc, va, mo)
}
- marshaler := va.Addr().Interface().(encoding.TextMarshaler)
+ marshaler, _ := reflect.TypeAssert[encoding.TextMarshaler](va.Addr())
if err := export.Encoder(enc).AppendRaw('"', false, func(b []byte) ([]byte, error) {
b2, err := marshaler.MarshalText()
return append(b, b2...), err
(needAddr && va.forcedAddr) {
return prevMarshal(enc, va, mo)
}
- appender := va.Addr().Interface().(encoding.TextAppender)
+ appender, _ := reflect.TypeAssert[encoding.TextAppender](va.Addr())
if err := export.Encoder(enc).AppendRaw('"', false, appender.AppendText); err != nil {
err = wrapSkipFunc(err, "append method")
if mo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
((needAddr && va.forcedAddr) || export.Encoder(enc).Tokens.Last.NeedObjectName()) {
return prevMarshal(enc, va, mo)
}
- marshaler := va.Addr().Interface().(Marshaler)
+ marshaler, _ := reflect.TypeAssert[Marshaler](va.Addr())
val, err := marshaler.MarshalJSON()
if err != nil {
err = wrapSkipFunc(err, "marshal method")
xe := export.Encoder(enc)
prevDepth, prevLength := xe.Tokens.DepthLength()
xe.Flags.Set(jsonflags.WithinArshalCall | 1)
- err := va.Addr().Interface().(MarshalerTo).MarshalJSONTo(enc)
+ marshaler, _ := reflect.TypeAssert[MarshalerTo](va.Addr())
+ err := marshaler.MarshalJSONTo(enc)
xe.Flags.Set(jsonflags.WithinArshalCall | 0)
currDepth, currLength := xe.Tokens.DepthLength()
if (prevDepth != currDepth || prevLength+1 != currLength) && err == nil {
return newUnmarshalErrorAfter(dec, t, errNonStringValue)
}
s := jsonwire.UnquoteMayCopy(val, flags.IsVerbatim())
- unmarshaler := va.Addr().Interface().(encoding.TextUnmarshaler)
+ unmarshaler, _ := reflect.TypeAssert[encoding.TextUnmarshaler](va.Addr())
if err := unmarshaler.UnmarshalText(s); err != nil {
err = wrapSkipFunc(err, "unmarshal method")
if uo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
if err != nil {
return err // must be a syntactic or I/O error
}
- unmarshaler := va.Addr().Interface().(Unmarshaler)
+ unmarshaler, _ := reflect.TypeAssert[Unmarshaler](va.Addr())
if err := unmarshaler.UnmarshalJSON(val); err != nil {
err = wrapSkipFunc(err, "unmarshal method")
if uo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
xd := export.Decoder(dec)
prevDepth, prevLength := xd.Tokens.DepthLength()
xd.Flags.Set(jsonflags.WithinArshalCall | 1)
- err := va.Addr().Interface().(UnmarshalerFrom).UnmarshalJSONFrom(dec)
+ unmarshaler, _ := reflect.TypeAssert[UnmarshalerFrom](va.Addr())
+ err := unmarshaler.UnmarshalJSONFrom(dec)
xd.Flags.Set(jsonflags.WithinArshalCall | 0)
currDepth, currLength := xd.Tokens.DepthLength()
if (prevDepth != currDepth || prevLength+1 != currLength) && err == nil {
return newMarshalErrorBefore(enc, t, errors.New("no default representation (see https://go.dev/issue/71631); specify an explicit format"))
}
- // TODO(https://go.dev/issue/62121): Use reflect.Value.AssertTo.
- m.td = *va.Addr().Interface().(*time.Duration)
+ m.td, _ = reflect.TypeAssert[time.Duration](va.Value)
k := stringOrNumberKind(!m.isNumeric() || xe.Tokens.Last.NeedObjectName() || mo.Flags.Get(jsonflags.StringifyNumbers))
if err := xe.AppendRaw(k, true, m.appendMarshal); err != nil {
if !isSyntacticError(err) && !export.IsIOError(err) {
stringify := !u.isNumeric() || xd.Tokens.Last.NeedObjectName() || uo.Flags.Get(jsonflags.StringifyNumbers)
var flags jsonwire.ValueFlags
- td := va.Addr().Interface().(*time.Duration)
+ td, _ := reflect.TypeAssert[*time.Duration](va.Addr())
val, err := xd.ReadValue(&flags)
if err != nil {
return err
}
}
- // TODO(https://go.dev/issue/62121): Use reflect.Value.AssertTo.
- m.tt = *va.Addr().Interface().(*time.Time)
+ m.tt, _ = reflect.TypeAssert[time.Time](va.Value)
k := stringOrNumberKind(!m.isNumeric() || xe.Tokens.Last.NeedObjectName() || mo.Flags.Get(jsonflags.StringifyNumbers))
if err := xe.AppendRaw(k, !m.hasCustomFormat(), m.appendMarshal); err != nil {
if mo.Flags.Get(jsonflags.ReportErrorsWithLegacySemantics) {
stringify := !u.isNumeric() || xd.Tokens.Last.NeedObjectName() || uo.Flags.Get(jsonflags.StringifyNumbers)
var flags jsonwire.ValueFlags
- tt := va.Addr().Interface().(*time.Time)
+ tt, _ := reflect.TypeAssert[*time.Time](va.Addr())
val, err := xd.ReadValue(&flags)
if err != nil {
return err