json.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. // This json support uses base64 encoding for bytes, because you cannot
  5. // store and read any arbitrary string in json (only unicode).
  6. //
  7. // This library specifically supports UTF-8 for encoding and decoding only.
  8. //
  9. // Note:
  10. // - we cannot use strconv.Quote and strconv.Unquote because json quotes/unquotes differently.
  11. // - encode does not beautify. There is no whitespace when encoding.
  12. // - rpc calls which take single integer arguments or write single numeric arguments will not
  13. // work well, as it may not be possible to know when a number ends (unlike string, etc with terminator char).
  14. // Luckily, rpc support in this package mitigates that via rpcEncodeTerminator interface.
  15. import (
  16. "bytes"
  17. "encoding/base64"
  18. "fmt"
  19. "io"
  20. "reflect"
  21. "strconv"
  22. "unicode/utf16"
  23. "unicode/utf8"
  24. )
  25. //--------------------------------
  26. var jsonLiterals = [...]byte{'t', 'r', 'u', 'e', 'f', 'a', 'l', 's', 'e', 'n', 'u', 'l', 'l'}
  27. type jsonEncDriver struct {
  28. w encWriter
  29. h *JsonHandle
  30. b [64]byte // scratch
  31. bs []byte // scratch
  32. noBuiltInTypes
  33. }
  34. func (e *jsonEncDriver) encodeNil() {
  35. e.w.writeb(jsonLiterals[9:]) // null
  36. }
  37. func (e *jsonEncDriver) encodeBool(b bool) {
  38. if b {
  39. e.w.writeb(jsonLiterals[:4]) // true
  40. } else {
  41. e.w.writeb(jsonLiterals[4:9]) // false
  42. }
  43. }
  44. func (e *jsonEncDriver) encodeFloat32(f float32) {
  45. e.w.writeb(strconv.AppendFloat(e.b[:0], float64(f), 'E', -1, 32))
  46. }
  47. func (e *jsonEncDriver) encodeFloat64(f float64) {
  48. // e.w.writestr(strconv.FormatFloat(f, 'E', -1, 64))
  49. e.w.writeb(strconv.AppendFloat(e.b[:0], f, 'E', -1, 64))
  50. }
  51. func (e *jsonEncDriver) encodeInt(v int64) {
  52. e.w.writeb(strconv.AppendInt(e.b[:0], v, 10))
  53. }
  54. func (e *jsonEncDriver) encodeUint(v uint64) {
  55. e.w.writeb(strconv.AppendUint(e.b[:0], v, 10))
  56. }
  57. func (e *jsonEncDriver) encodeExt(rv reflect.Value, xtag uint64, ext Ext, en *Encoder) {
  58. if v := ext.ConvertExt(rv); v == nil {
  59. e.encodeNil()
  60. } else {
  61. en.encode(v)
  62. }
  63. }
  64. func (e *jsonEncDriver) encodeRawExt(re *RawExt, en *Encoder) {
  65. // only encodes re.Value (never re.Data)
  66. if re.Value == nil {
  67. e.encodeNil()
  68. } else {
  69. en.encode(re.Value)
  70. }
  71. }
  72. func (e *jsonEncDriver) encodeArrayStart(length int) {
  73. e.w.writen1('[')
  74. }
  75. func (e *jsonEncDriver) encodeArrayEntrySeparator() {
  76. e.w.writen1(',')
  77. }
  78. func (e *jsonEncDriver) encodeArrayEnd() {
  79. e.w.writen1(']')
  80. }
  81. func (e *jsonEncDriver) encodeMapStart(length int) {
  82. e.w.writen1('{')
  83. }
  84. func (e *jsonEncDriver) encodeMapEntrySeparator() {
  85. e.w.writen1(',')
  86. }
  87. func (e *jsonEncDriver) encodeMapKVSeparator() {
  88. e.w.writen1(':')
  89. }
  90. func (e *jsonEncDriver) encodeMapEnd() {
  91. e.w.writen1('}')
  92. }
  93. func (e *jsonEncDriver) encodeString(c charEncoding, v string) {
  94. // e.w.writestr(strconv.Quote(v))
  95. e.quoteStr(v)
  96. }
  97. func (e *jsonEncDriver) encodeSymbol(v string) {
  98. e.encodeString(c_UTF8, v)
  99. }
  100. func (e *jsonEncDriver) encodeStringBytes(c charEncoding, v []byte) {
  101. if c == c_RAW {
  102. slen := base64.StdEncoding.EncodedLen(len(v))
  103. if e.bs == nil {
  104. e.bs = e.b[:]
  105. }
  106. if cap(e.bs) >= slen {
  107. e.bs = e.bs[:slen]
  108. } else {
  109. e.bs = make([]byte, slen)
  110. }
  111. base64.StdEncoding.Encode(e.bs, v)
  112. e.w.writen1('"')
  113. e.w.writeb(e.bs)
  114. e.w.writen1('"')
  115. } else {
  116. e.encodeString(c, string(v))
  117. }
  118. }
  119. func (e *jsonEncDriver) quoteStr(s string) {
  120. // adapted from std pkg encoding/json
  121. const hex = "0123456789abcdef"
  122. w := e.w
  123. w.writen1('"')
  124. start := 0
  125. for i := 0; i < len(s); {
  126. if b := s[i]; b < utf8.RuneSelf {
  127. if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
  128. i++
  129. continue
  130. }
  131. if start < i {
  132. w.writestr(s[start:i])
  133. }
  134. switch b {
  135. case '\\', '"':
  136. w.writen2('\\', b)
  137. case '\n':
  138. w.writen2('\\', 'n')
  139. case '\r':
  140. w.writen2('\\', 'r')
  141. case '\b':
  142. w.writen2('\\', 'b')
  143. case '\f':
  144. w.writen2('\\', 'f')
  145. case '\t':
  146. w.writen2('\\', 't')
  147. default:
  148. w.writestr(`\u00`)
  149. w.writen1(hex[b>>4])
  150. w.writen1(hex[b&0xF])
  151. }
  152. i++
  153. start = i
  154. continue
  155. }
  156. c, size := utf8.DecodeRuneInString(s[i:])
  157. if c == utf8.RuneError && size == 1 {
  158. if start < i {
  159. w.writestr(s[start:i])
  160. }
  161. w.writestr(`\ufffd`)
  162. i += size
  163. start = i
  164. continue
  165. }
  166. // U+2028 is LINE SEPARATOR. U+2029 is PARAGRAPH SEPARATOR.
  167. // Both technically valid JSON, but bomb on JSONP, so fix here.
  168. if c == '\u2028' || c == '\u2029' {
  169. if start < i {
  170. w.writestr(s[start:i])
  171. }
  172. w.writestr(`\u202`)
  173. w.writen1(hex[c&0xF])
  174. i += size
  175. start = i
  176. continue
  177. }
  178. i += size
  179. }
  180. if start < len(s) {
  181. w.writestr(s[start:])
  182. }
  183. w.writen1('"')
  184. }
  185. //--------------------------------
  186. type jsonDecDriver struct {
  187. h *JsonHandle
  188. r decReader
  189. ct valueType // container type. one of unset, array or map.
  190. b [64]byte // scratch
  191. b2 [8]byte // scratch
  192. noBuiltInTypes
  193. }
  194. // This will skip whitespace characters and return the next byte to read.
  195. // The next byte determines what the value will be one of.
  196. func (d *jsonDecDriver) skipWhitespace(unread bool) (b byte) {
  197. for b = d.r.readn1(); b == ' ' || b == '\t' || b == '\r' || b == '\n'; b = d.r.readn1() {
  198. }
  199. if unread {
  200. d.r.unreadn1()
  201. }
  202. return b
  203. }
  204. func (d *jsonDecDriver) initReadNext() {
  205. d.skipWhitespace(true)
  206. d.ct = valueTypeUnset
  207. }
  208. func (d *jsonDecDriver) checkBreak() bool {
  209. b := d.skipWhitespace(true)
  210. return b == '}' || b == ']'
  211. }
  212. func (d *jsonDecDriver) readStr(s []byte) {
  213. bs := d.b[:len(s)]
  214. d.r.readb(bs)
  215. if !bytes.Equal(bs, s) {
  216. decErr("json: expecting null: got %s", bs)
  217. }
  218. }
  219. func (d *jsonDecDriver) tryDecodeAsNil() bool {
  220. b := d.skipWhitespace(true)
  221. if b == 'n' {
  222. d.readStr(jsonLiterals[9:]) // null
  223. d.ct = valueTypeNil
  224. return true
  225. }
  226. return false
  227. }
  228. func (d *jsonDecDriver) decodeBool() bool {
  229. b := d.skipWhitespace(false)
  230. if b == 'f' {
  231. d.readStr(jsonLiterals[5:9]) // alse
  232. return false
  233. }
  234. if b == 't' {
  235. d.readStr(jsonLiterals[1:4]) // rue
  236. return true
  237. }
  238. decErr("json: decode bool: got first char %c", b)
  239. panic("unreachable")
  240. }
  241. func (d *jsonDecDriver) readMapStart() int {
  242. d.expectChar('{')
  243. d.ct = valueTypeMap
  244. return -1
  245. }
  246. func (d *jsonDecDriver) readArrayStart() int {
  247. d.expectChar('[')
  248. d.ct = valueTypeArray
  249. return -1
  250. }
  251. func (d *jsonDecDriver) readMapEnd() {
  252. d.expectChar('}')
  253. }
  254. func (d *jsonDecDriver) readArrayEnd() {
  255. d.expectChar(']')
  256. }
  257. func (d *jsonDecDriver) readArrayEntrySeparator() {
  258. d.expectChar(',')
  259. }
  260. func (d *jsonDecDriver) readMapEntrySeparator() {
  261. d.expectChar(',')
  262. }
  263. func (d *jsonDecDriver) readMapKVSeparator() {
  264. d.expectChar(':')
  265. }
  266. func (d *jsonDecDriver) expectChar(c uint8) {
  267. b := d.skipWhitespace(false)
  268. if b != c {
  269. decErr("json: expect char %c but got char %c", c, b)
  270. }
  271. }
  272. func (d *jsonDecDriver) isContainerType(vt valueType) bool {
  273. // check container type by checking the first char
  274. if d.ct == valueTypeUnset {
  275. b := d.skipWhitespace(true)
  276. switch b {
  277. case '{':
  278. d.ct = valueTypeMap
  279. case '[':
  280. d.ct = valueTypeArray
  281. case 'n':
  282. d.ct = valueTypeNil
  283. case '"':
  284. d.ct = valueTypeString
  285. }
  286. }
  287. switch vt {
  288. case valueTypeNil, valueTypeBytes, valueTypeString, valueTypeArray, valueTypeMap:
  289. return d.ct == vt
  290. }
  291. decErr("isContainerType: unsupported parameter: %v", vt)
  292. panic("unreachable")
  293. }
  294. func (d *jsonDecDriver) decNum() (i int64, f float64, isFloat bool) {
  295. // If it is has a . or an e|E, decode as a float; else decode as an int.
  296. b := d.skipWhitespace(false)
  297. if !(b == '+' || b == '-' || b == '.' || (b >= '0' && b <= '9')) {
  298. decErr("json: decNum: got first char %c", b)
  299. }
  300. var eof bool
  301. bs := d.b[:0]
  302. for {
  303. if b == '.' || b == 'e' || b == 'E' {
  304. isFloat = true
  305. } else if b == '+' || b == '-' || (b >= '0' && b <= '9') {
  306. } else {
  307. d.r.unreadn1()
  308. break
  309. }
  310. bs = append(bs, b)
  311. b, eof = d.readn1eof()
  312. if eof {
  313. break
  314. }
  315. }
  316. var err error
  317. if isFloat {
  318. f, err = strconv.ParseFloat(string(bs), 64)
  319. } else {
  320. i, err = strconv.ParseInt(string(bs), 10, 64)
  321. }
  322. if err != nil {
  323. decErr("decNum: %v", err)
  324. }
  325. return
  326. }
  327. func (d *jsonDecDriver) decodeInt(bitsize uint8) (i int64) {
  328. i, xf, xisFloat := d.decNum()
  329. if xisFloat {
  330. i = int64(xf)
  331. }
  332. checkOverflow(0, i, bitsize)
  333. return
  334. }
  335. func (d *jsonDecDriver) decodeUint(bitsize uint8) (ui uint64) {
  336. xi, xf, xisFloat := d.decNum()
  337. if (xisFloat && xf < 0) || (!xisFloat && xi < 0) {
  338. decErr("received negative number decoding number into uint: %v, %v", xi, xf)
  339. }
  340. if xisFloat {
  341. ui = uint64(xf)
  342. } else {
  343. ui = uint64(xi)
  344. }
  345. checkOverflow(ui, 0, bitsize)
  346. return
  347. }
  348. func (d *jsonDecDriver) decodeFloat(chkOverflow32 bool) (f float64) {
  349. xi, f, xisFloat := d.decNum()
  350. if !xisFloat {
  351. f = float64(xi)
  352. }
  353. checkOverflowFloat32(f, chkOverflow32)
  354. return
  355. }
  356. func (d *jsonDecDriver) decodeBytes(bs []byte) (bsOut []byte, changed bool) {
  357. s := d.decStringAsBytes(nil)
  358. slen := base64.StdEncoding.DecodedLen(len(s))
  359. if len(bs) < slen {
  360. changed = true
  361. bsOut = make([]byte, slen)
  362. bs = bsOut
  363. } else if len(bs) > slen {
  364. changed = true
  365. bsOut = bs[:slen]
  366. bs = bsOut
  367. }
  368. base64.StdEncoding.Decode(bs, s)
  369. return
  370. }
  371. func (d *jsonDecDriver) decodeExt(rv reflect.Value, xtag uint64, ext Ext, de *Decoder) (realxtag uint64) {
  372. if ext == nil {
  373. re := rv.Interface().(*RawExt)
  374. re.Tag = xtag
  375. de.decode(&re.Value)
  376. } else {
  377. var v interface{}
  378. de.decode(&v)
  379. ext.UpdateExt(rv, v)
  380. }
  381. return
  382. }
  383. func (d *jsonDecDriver) decodeString() (s string) {
  384. return string(d.decStringAsBytes(nil))
  385. }
  386. func (d *jsonDecDriver) decStringAsBytes(v []byte) []byte {
  387. d.expectChar('"')
  388. if v == nil {
  389. v = d.b[:0]
  390. }
  391. for {
  392. c := d.r.readn1()
  393. if c == '"' {
  394. break
  395. } else if c == '\\' {
  396. c = d.r.readn1()
  397. switch c {
  398. case '"', '\\', '/', '\'':
  399. v = append(v, c)
  400. case 'b':
  401. v = append(v, '\b')
  402. case 'f':
  403. v = append(v, '\f')
  404. case 'n':
  405. v = append(v, '\n')
  406. case 'r':
  407. v = append(v, '\r')
  408. case 't':
  409. v = append(v, '\t')
  410. case 'u':
  411. rr := d.jsonU4(false)
  412. fmt.Printf("$$$$$$$$$: is surrogate: %v\n", utf16.IsSurrogate(rr))
  413. if utf16.IsSurrogate(rr) {
  414. rr = utf16.DecodeRune(rr, d.jsonU4(true))
  415. }
  416. w2 := utf8.EncodeRune(d.b2[:], rr)
  417. v = append(v, d.b2[:w2]...)
  418. default:
  419. decErr("json: unsupported escaped value: %c", c)
  420. }
  421. } else {
  422. v = append(v, c)
  423. }
  424. }
  425. return v
  426. }
  427. func (d *jsonDecDriver) jsonU4(checkSlashU bool) rune {
  428. if checkSlashU && !(d.r.readn1() == '\\' && d.r.readn1() == 'u') {
  429. decErr(`json: unquoteStr: invalid unicode sequence. Expecting \u`)
  430. }
  431. d.r.readb(d.b2[:4])
  432. ui4, err4 := strconv.ParseUint(string(d.b2[:4]), 16, 64)
  433. if err4 != nil {
  434. decErr("json: unquoteStr: %v", err4)
  435. }
  436. return rune(ui4)
  437. }
  438. func (d *jsonDecDriver) decodeNaked(de *Decoder) (v interface{}, vt valueType, decodeFurther bool) {
  439. n := d.skipWhitespace(true)
  440. switch n {
  441. case 'n':
  442. d.readStr(jsonLiterals[9:]) // null
  443. vt = valueTypeNil
  444. case 'f':
  445. d.readStr(jsonLiterals[4:9]) // false
  446. vt = valueTypeBool
  447. v = false
  448. case 't':
  449. d.readStr(jsonLiterals[:4]) // true
  450. vt = valueTypeBool
  451. v = true
  452. case '{':
  453. vt = valueTypeMap
  454. decodeFurther = true
  455. case '[':
  456. vt = valueTypeArray
  457. decodeFurther = true
  458. case '"':
  459. vt = valueTypeString
  460. v = d.decodeString()
  461. default:
  462. xi, xf, xisFloat := d.decNum()
  463. if xisFloat {
  464. vt = valueTypeFloat
  465. v = xf
  466. } else if xi < 0 || d.h.SignedInteger {
  467. vt = valueTypeInt
  468. v = xi
  469. } else {
  470. vt = valueTypeUint
  471. v = uint64(xi)
  472. }
  473. }
  474. return
  475. }
  476. func (d *jsonDecDriver) readn1eof() (v uint8, eof bool) {
  477. defer func() {
  478. if x := recover(); x != nil {
  479. if x != io.EOF {
  480. panic(x)
  481. }
  482. eof = true
  483. }
  484. }()
  485. v = d.r.readn1()
  486. return
  487. }
  488. //----------------------
  489. // JsonHandle is a handle for JSON encoding format.
  490. //
  491. // Json is comprehensively supported:
  492. // - decodes numbers into interface{} as int, uint or float64
  493. // - encodes and decodes []byte using base64 Std Encoding
  494. // - UTF-8 support for encoding and decoding
  495. //
  496. // It has better performance than the json library in the standard library,
  497. // by leveraging the performance improvements of the codec library and minimizing allocations.
  498. //
  499. // In addition, it doesn't read more bytes than necessary during a decode, which allows
  500. // the use of this to read multiple values from a stream containing json and non-json content.
  501. type JsonHandle struct {
  502. BasicHandle
  503. }
  504. func (h *JsonHandle) newEncDriver(w encWriter) encDriver {
  505. return &jsonEncDriver{w: w, h: h}
  506. }
  507. func (h *JsonHandle) newDecDriver(r decReader) decDriver {
  508. return &jsonDecDriver{r: r, h: h}
  509. }
  510. func (h *JsonHandle) isBinaryEncoding() bool {
  511. return false
  512. }
  513. var jsonEncodeTerminate = []byte{' '}
  514. func (h *JsonHandle) rpcEncodeTerminate() []byte {
  515. return jsonEncodeTerminate
  516. }
  517. var _ decDriver = (*jsonDecDriver)(nil)
  518. var _ encDriver = (*jsonEncDriver)(nil)