interface.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. package decoder
  2. import (
  3. "bytes"
  4. "encoding"
  5. "encoding/json"
  6. "reflect"
  7. "unsafe"
  8. "github.com/goccy/go-json/internal/errors"
  9. "github.com/goccy/go-json/internal/runtime"
  10. )
  11. type interfaceDecoder struct {
  12. typ *runtime.Type
  13. structName string
  14. fieldName string
  15. sliceDecoder *sliceDecoder
  16. mapDecoder *mapDecoder
  17. floatDecoder *floatDecoder
  18. numberDecoder *numberDecoder
  19. stringDecoder *stringDecoder
  20. }
  21. func newEmptyInterfaceDecoder(structName, fieldName string) *interfaceDecoder {
  22. ifaceDecoder := &interfaceDecoder{
  23. typ: emptyInterfaceType,
  24. structName: structName,
  25. fieldName: fieldName,
  26. floatDecoder: newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  27. *(*interface{})(p) = v
  28. }),
  29. numberDecoder: newNumberDecoder(structName, fieldName, func(p unsafe.Pointer, v json.Number) {
  30. *(*interface{})(p) = v
  31. }),
  32. stringDecoder: newStringDecoder(structName, fieldName),
  33. }
  34. ifaceDecoder.sliceDecoder = newSliceDecoder(
  35. ifaceDecoder,
  36. emptyInterfaceType,
  37. emptyInterfaceType.Size(),
  38. structName, fieldName,
  39. )
  40. ifaceDecoder.mapDecoder = newMapDecoder(
  41. interfaceMapType,
  42. stringType,
  43. ifaceDecoder.stringDecoder,
  44. interfaceMapType.Elem(),
  45. ifaceDecoder,
  46. structName,
  47. fieldName,
  48. )
  49. return ifaceDecoder
  50. }
  51. func newInterfaceDecoder(typ *runtime.Type, structName, fieldName string) *interfaceDecoder {
  52. emptyIfaceDecoder := newEmptyInterfaceDecoder(structName, fieldName)
  53. stringDecoder := newStringDecoder(structName, fieldName)
  54. return &interfaceDecoder{
  55. typ: typ,
  56. structName: structName,
  57. fieldName: fieldName,
  58. sliceDecoder: newSliceDecoder(
  59. emptyIfaceDecoder,
  60. emptyInterfaceType,
  61. emptyInterfaceType.Size(),
  62. structName, fieldName,
  63. ),
  64. mapDecoder: newMapDecoder(
  65. interfaceMapType,
  66. stringType,
  67. stringDecoder,
  68. interfaceMapType.Elem(),
  69. emptyIfaceDecoder,
  70. structName,
  71. fieldName,
  72. ),
  73. floatDecoder: newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  74. *(*interface{})(p) = v
  75. }),
  76. numberDecoder: newNumberDecoder(structName, fieldName, func(p unsafe.Pointer, v json.Number) {
  77. *(*interface{})(p) = v
  78. }),
  79. stringDecoder: stringDecoder,
  80. }
  81. }
  82. func (d *interfaceDecoder) numDecoder(s *Stream) Decoder {
  83. if s.UseNumber {
  84. return d.numberDecoder
  85. }
  86. return d.floatDecoder
  87. }
  88. var (
  89. emptyInterfaceType = runtime.Type2RType(reflect.TypeOf((*interface{})(nil)).Elem())
  90. EmptyInterfaceType = emptyInterfaceType
  91. interfaceMapType = runtime.Type2RType(
  92. reflect.TypeOf((*map[string]interface{})(nil)).Elem(),
  93. )
  94. stringType = runtime.Type2RType(
  95. reflect.TypeOf(""),
  96. )
  97. )
  98. func decodeStreamUnmarshaler(s *Stream, depth int64, unmarshaler json.Unmarshaler) error {
  99. start := s.cursor
  100. if err := s.skipValue(depth); err != nil {
  101. return err
  102. }
  103. src := s.buf[start:s.cursor]
  104. dst := make([]byte, len(src))
  105. copy(dst, src)
  106. if err := unmarshaler.UnmarshalJSON(dst); err != nil {
  107. return err
  108. }
  109. return nil
  110. }
  111. func decodeStreamUnmarshalerContext(s *Stream, depth int64, unmarshaler unmarshalerContext) error {
  112. start := s.cursor
  113. if err := s.skipValue(depth); err != nil {
  114. return err
  115. }
  116. src := s.buf[start:s.cursor]
  117. dst := make([]byte, len(src))
  118. copy(dst, src)
  119. if err := unmarshaler.UnmarshalJSON(s.Option.Context, dst); err != nil {
  120. return err
  121. }
  122. return nil
  123. }
  124. func decodeUnmarshaler(buf []byte, cursor, depth int64, unmarshaler json.Unmarshaler) (int64, error) {
  125. cursor = skipWhiteSpace(buf, cursor)
  126. start := cursor
  127. end, err := skipValue(buf, cursor, depth)
  128. if err != nil {
  129. return 0, err
  130. }
  131. src := buf[start:end]
  132. dst := make([]byte, len(src))
  133. copy(dst, src)
  134. if err := unmarshaler.UnmarshalJSON(dst); err != nil {
  135. return 0, err
  136. }
  137. return end, nil
  138. }
  139. func decodeUnmarshalerContext(ctx *RuntimeContext, buf []byte, cursor, depth int64, unmarshaler unmarshalerContext) (int64, error) {
  140. cursor = skipWhiteSpace(buf, cursor)
  141. start := cursor
  142. end, err := skipValue(buf, cursor, depth)
  143. if err != nil {
  144. return 0, err
  145. }
  146. src := buf[start:end]
  147. dst := make([]byte, len(src))
  148. copy(dst, src)
  149. if err := unmarshaler.UnmarshalJSON(ctx.Option.Context, dst); err != nil {
  150. return 0, err
  151. }
  152. return end, nil
  153. }
  154. func decodeStreamTextUnmarshaler(s *Stream, depth int64, unmarshaler encoding.TextUnmarshaler, p unsafe.Pointer) error {
  155. start := s.cursor
  156. if err := s.skipValue(depth); err != nil {
  157. return err
  158. }
  159. src := s.buf[start:s.cursor]
  160. if bytes.Equal(src, nullbytes) {
  161. *(*unsafe.Pointer)(p) = nil
  162. return nil
  163. }
  164. dst := make([]byte, len(src))
  165. copy(dst, src)
  166. if err := unmarshaler.UnmarshalText(dst); err != nil {
  167. return err
  168. }
  169. return nil
  170. }
  171. func decodeTextUnmarshaler(buf []byte, cursor, depth int64, unmarshaler encoding.TextUnmarshaler, p unsafe.Pointer) (int64, error) {
  172. cursor = skipWhiteSpace(buf, cursor)
  173. start := cursor
  174. end, err := skipValue(buf, cursor, depth)
  175. if err != nil {
  176. return 0, err
  177. }
  178. src := buf[start:end]
  179. if bytes.Equal(src, nullbytes) {
  180. *(*unsafe.Pointer)(p) = nil
  181. return end, nil
  182. }
  183. if s, ok := unquoteBytes(src); ok {
  184. src = s
  185. }
  186. if err := unmarshaler.UnmarshalText(src); err != nil {
  187. return 0, err
  188. }
  189. return end, nil
  190. }
  191. func (d *interfaceDecoder) decodeStreamEmptyInterface(s *Stream, depth int64, p unsafe.Pointer) error {
  192. c := s.skipWhiteSpace()
  193. for {
  194. switch c {
  195. case '{':
  196. var v map[string]interface{}
  197. ptr := unsafe.Pointer(&v)
  198. if err := d.mapDecoder.DecodeStream(s, depth, ptr); err != nil {
  199. return err
  200. }
  201. *(*interface{})(p) = v
  202. return nil
  203. case '[':
  204. var v []interface{}
  205. ptr := unsafe.Pointer(&v)
  206. if err := d.sliceDecoder.DecodeStream(s, depth, ptr); err != nil {
  207. return err
  208. }
  209. *(*interface{})(p) = v
  210. return nil
  211. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  212. return d.numDecoder(s).DecodeStream(s, depth, p)
  213. case '"':
  214. s.cursor++
  215. start := s.cursor
  216. for {
  217. switch s.char() {
  218. case '\\':
  219. if _, err := decodeEscapeString(s, nil); err != nil {
  220. return err
  221. }
  222. case '"':
  223. literal := s.buf[start:s.cursor]
  224. s.cursor++
  225. *(*interface{})(p) = string(literal)
  226. return nil
  227. case nul:
  228. if s.read() {
  229. continue
  230. }
  231. return errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  232. }
  233. s.cursor++
  234. }
  235. case 't':
  236. if err := trueBytes(s); err != nil {
  237. return err
  238. }
  239. **(**interface{})(unsafe.Pointer(&p)) = true
  240. return nil
  241. case 'f':
  242. if err := falseBytes(s); err != nil {
  243. return err
  244. }
  245. **(**interface{})(unsafe.Pointer(&p)) = false
  246. return nil
  247. case 'n':
  248. if err := nullBytes(s); err != nil {
  249. return err
  250. }
  251. *(*interface{})(p) = nil
  252. return nil
  253. case nul:
  254. if s.read() {
  255. c = s.char()
  256. continue
  257. }
  258. }
  259. break
  260. }
  261. return errors.ErrInvalidBeginningOfValue(c, s.totalOffset())
  262. }
  263. type emptyInterface struct {
  264. typ *runtime.Type
  265. ptr unsafe.Pointer
  266. }
  267. func (d *interfaceDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  268. runtimeInterfaceValue := *(*interface{})(unsafe.Pointer(&emptyInterface{
  269. typ: d.typ,
  270. ptr: p,
  271. }))
  272. rv := reflect.ValueOf(runtimeInterfaceValue)
  273. if rv.NumMethod() > 0 && rv.CanInterface() {
  274. if u, ok := rv.Interface().(unmarshalerContext); ok {
  275. return decodeStreamUnmarshalerContext(s, depth, u)
  276. }
  277. if u, ok := rv.Interface().(json.Unmarshaler); ok {
  278. return decodeStreamUnmarshaler(s, depth, u)
  279. }
  280. if u, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
  281. return decodeStreamTextUnmarshaler(s, depth, u, p)
  282. }
  283. if s.skipWhiteSpace() == 'n' {
  284. if err := nullBytes(s); err != nil {
  285. return err
  286. }
  287. *(*interface{})(p) = nil
  288. return nil
  289. }
  290. return d.errUnmarshalType(rv.Type(), s.totalOffset())
  291. }
  292. iface := rv.Interface()
  293. ifaceHeader := (*emptyInterface)(unsafe.Pointer(&iface))
  294. typ := ifaceHeader.typ
  295. if ifaceHeader.ptr == nil || d.typ == typ || typ == nil {
  296. // concrete type is empty interface
  297. return d.decodeStreamEmptyInterface(s, depth, p)
  298. }
  299. if typ.Kind() == reflect.Ptr && typ.Elem() == d.typ || typ.Kind() != reflect.Ptr {
  300. return d.decodeStreamEmptyInterface(s, depth, p)
  301. }
  302. if s.skipWhiteSpace() == 'n' {
  303. if err := nullBytes(s); err != nil {
  304. return err
  305. }
  306. *(*interface{})(p) = nil
  307. return nil
  308. }
  309. decoder, err := CompileToGetDecoder(typ)
  310. if err != nil {
  311. return err
  312. }
  313. return decoder.DecodeStream(s, depth, ifaceHeader.ptr)
  314. }
  315. func (d *interfaceDecoder) errUnmarshalType(typ reflect.Type, offset int64) *errors.UnmarshalTypeError {
  316. return &errors.UnmarshalTypeError{
  317. Value: typ.String(),
  318. Type: typ,
  319. Offset: offset,
  320. Struct: d.structName,
  321. Field: d.fieldName,
  322. }
  323. }
  324. func (d *interfaceDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  325. buf := ctx.Buf
  326. runtimeInterfaceValue := *(*interface{})(unsafe.Pointer(&emptyInterface{
  327. typ: d.typ,
  328. ptr: p,
  329. }))
  330. rv := reflect.ValueOf(runtimeInterfaceValue)
  331. if rv.NumMethod() > 0 && rv.CanInterface() {
  332. if u, ok := rv.Interface().(unmarshalerContext); ok {
  333. return decodeUnmarshalerContext(ctx, buf, cursor, depth, u)
  334. }
  335. if u, ok := rv.Interface().(json.Unmarshaler); ok {
  336. return decodeUnmarshaler(buf, cursor, depth, u)
  337. }
  338. if u, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
  339. return decodeTextUnmarshaler(buf, cursor, depth, u, p)
  340. }
  341. cursor = skipWhiteSpace(buf, cursor)
  342. if buf[cursor] == 'n' {
  343. if err := validateNull(buf, cursor); err != nil {
  344. return 0, err
  345. }
  346. cursor += 4
  347. **(**interface{})(unsafe.Pointer(&p)) = nil
  348. return cursor, nil
  349. }
  350. return 0, d.errUnmarshalType(rv.Type(), cursor)
  351. }
  352. iface := rv.Interface()
  353. ifaceHeader := (*emptyInterface)(unsafe.Pointer(&iface))
  354. typ := ifaceHeader.typ
  355. if ifaceHeader.ptr == nil || d.typ == typ || typ == nil {
  356. // concrete type is empty interface
  357. return d.decodeEmptyInterface(ctx, cursor, depth, p)
  358. }
  359. if typ.Kind() == reflect.Ptr && typ.Elem() == d.typ || typ.Kind() != reflect.Ptr {
  360. return d.decodeEmptyInterface(ctx, cursor, depth, p)
  361. }
  362. cursor = skipWhiteSpace(buf, cursor)
  363. if buf[cursor] == 'n' {
  364. if err := validateNull(buf, cursor); err != nil {
  365. return 0, err
  366. }
  367. cursor += 4
  368. **(**interface{})(unsafe.Pointer(&p)) = nil
  369. return cursor, nil
  370. }
  371. decoder, err := CompileToGetDecoder(typ)
  372. if err != nil {
  373. return 0, err
  374. }
  375. return decoder.Decode(ctx, cursor, depth, ifaceHeader.ptr)
  376. }
  377. func (d *interfaceDecoder) decodeEmptyInterface(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  378. buf := ctx.Buf
  379. cursor = skipWhiteSpace(buf, cursor)
  380. switch buf[cursor] {
  381. case '{':
  382. var v map[string]interface{}
  383. ptr := unsafe.Pointer(&v)
  384. cursor, err := d.mapDecoder.Decode(ctx, cursor, depth, ptr)
  385. if err != nil {
  386. return 0, err
  387. }
  388. **(**interface{})(unsafe.Pointer(&p)) = v
  389. return cursor, nil
  390. case '[':
  391. var v []interface{}
  392. ptr := unsafe.Pointer(&v)
  393. cursor, err := d.sliceDecoder.Decode(ctx, cursor, depth, ptr)
  394. if err != nil {
  395. return 0, err
  396. }
  397. **(**interface{})(unsafe.Pointer(&p)) = v
  398. return cursor, nil
  399. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  400. return d.floatDecoder.Decode(ctx, cursor, depth, p)
  401. case '"':
  402. var v string
  403. ptr := unsafe.Pointer(&v)
  404. cursor, err := d.stringDecoder.Decode(ctx, cursor, depth, ptr)
  405. if err != nil {
  406. return 0, err
  407. }
  408. **(**interface{})(unsafe.Pointer(&p)) = v
  409. return cursor, nil
  410. case 't':
  411. if err := validateTrue(buf, cursor); err != nil {
  412. return 0, err
  413. }
  414. cursor += 4
  415. **(**interface{})(unsafe.Pointer(&p)) = true
  416. return cursor, nil
  417. case 'f':
  418. if err := validateFalse(buf, cursor); err != nil {
  419. return 0, err
  420. }
  421. cursor += 5
  422. **(**interface{})(unsafe.Pointer(&p)) = false
  423. return cursor, nil
  424. case 'n':
  425. if err := validateNull(buf, cursor); err != nil {
  426. return 0, err
  427. }
  428. cursor += 4
  429. **(**interface{})(unsafe.Pointer(&p)) = nil
  430. return cursor, nil
  431. }
  432. return cursor, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
  433. }
  434. func NewPathDecoder() Decoder {
  435. ifaceDecoder := &interfaceDecoder{
  436. typ: emptyInterfaceType,
  437. structName: "",
  438. fieldName: "",
  439. floatDecoder: newFloatDecoder("", "", func(p unsafe.Pointer, v float64) {
  440. *(*interface{})(p) = v
  441. }),
  442. numberDecoder: newNumberDecoder("", "", func(p unsafe.Pointer, v json.Number) {
  443. *(*interface{})(p) = v
  444. }),
  445. stringDecoder: newStringDecoder("", ""),
  446. }
  447. ifaceDecoder.sliceDecoder = newSliceDecoder(
  448. ifaceDecoder,
  449. emptyInterfaceType,
  450. emptyInterfaceType.Size(),
  451. "", "",
  452. )
  453. ifaceDecoder.mapDecoder = newMapDecoder(
  454. interfaceMapType,
  455. stringType,
  456. ifaceDecoder.stringDecoder,
  457. interfaceMapType.Elem(),
  458. ifaceDecoder,
  459. "", "",
  460. )
  461. return ifaceDecoder
  462. }
  463. var (
  464. truebytes = []byte("true")
  465. falsebytes = []byte("false")
  466. )
  467. func (d *interfaceDecoder) DecodePath(ctx *RuntimeContext, cursor, depth int64) ([][]byte, int64, error) {
  468. buf := ctx.Buf
  469. cursor = skipWhiteSpace(buf, cursor)
  470. switch buf[cursor] {
  471. case '{':
  472. return d.mapDecoder.DecodePath(ctx, cursor, depth)
  473. case '[':
  474. return d.sliceDecoder.DecodePath(ctx, cursor, depth)
  475. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  476. return d.floatDecoder.DecodePath(ctx, cursor, depth)
  477. case '"':
  478. return d.stringDecoder.DecodePath(ctx, cursor, depth)
  479. case 't':
  480. if err := validateTrue(buf, cursor); err != nil {
  481. return nil, 0, err
  482. }
  483. cursor += 4
  484. return [][]byte{truebytes}, cursor, nil
  485. case 'f':
  486. if err := validateFalse(buf, cursor); err != nil {
  487. return nil, 0, err
  488. }
  489. cursor += 5
  490. return [][]byte{falsebytes}, cursor, nil
  491. case 'n':
  492. if err := validateNull(buf, cursor); err != nil {
  493. return nil, 0, err
  494. }
  495. cursor += 4
  496. return [][]byte{nullbytes}, cursor, nil
  497. }
  498. return nil, cursor, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
  499. }