node.go 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679
  1. /*
  2. * Copyright 2021 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package ast
  17. import (
  18. `encoding/json`
  19. `fmt`
  20. `strconv`
  21. `unsafe`
  22. `github.com/bytedance/sonic/internal/native/types`
  23. `github.com/bytedance/sonic/internal/rt`
  24. )
  25. const (
  26. _V_NONE types.ValueType = 0
  27. _V_NODE_BASE types.ValueType = 1 << 5
  28. _V_LAZY types.ValueType = 1 << 7
  29. _V_RAW types.ValueType = 1 << 8
  30. _V_NUMBER = _V_NODE_BASE + 1
  31. _V_ANY = _V_NODE_BASE + 2
  32. _V_ARRAY_LAZY = _V_LAZY | types.V_ARRAY
  33. _V_OBJECT_LAZY = _V_LAZY | types.V_OBJECT
  34. _MASK_LAZY = _V_LAZY - 1
  35. _MASK_RAW = _V_RAW - 1
  36. )
  37. const (
  38. V_NONE = 0
  39. V_ERROR = 1
  40. V_NULL = int(types.V_NULL)
  41. V_TRUE = int(types.V_TRUE)
  42. V_FALSE = int(types.V_FALSE)
  43. V_ARRAY = int(types.V_ARRAY)
  44. V_OBJECT = int(types.V_OBJECT)
  45. V_STRING = int(types.V_STRING)
  46. V_NUMBER = int(_V_NUMBER)
  47. V_ANY = int(_V_ANY)
  48. )
  49. type Node struct {
  50. t types.ValueType
  51. l uint
  52. p unsafe.Pointer
  53. }
  54. // UnmarshalJSON is just an adapter to json.Unmarshaler.
  55. // If you want better performance, use Searcher.GetByPath() directly
  56. func (self *Node) UnmarshalJSON(data []byte) (err error) {
  57. *self = NewRaw(string(data))
  58. return self.Check()
  59. }
  60. /** Node Type Accessor **/
  61. // Type returns json type represented by the node
  62. // It will be one of belows:
  63. // V_NONE = 0 (empty node, key not exists)
  64. // V_ERROR = 1 (error node)
  65. // V_NULL = 2 (json value `null`, key exists)
  66. // V_TRUE = 3 (json value `true`)
  67. // V_FALSE = 4 (json value `false`)
  68. // V_ARRAY = 5 (json value array)
  69. // V_OBJECT = 6 (json value object)
  70. // V_STRING = 7 (json value string)
  71. // V_NUMBER = 33 (json value number )
  72. // V_ANY = 34 (golang interface{})
  73. func (self Node) Type() int {
  74. return int(self.t & _MASK_LAZY & _MASK_RAW)
  75. }
  76. func (self Node) itype() types.ValueType {
  77. return self.t & _MASK_LAZY & _MASK_RAW
  78. }
  79. // Exists returns false only if the self is nil or empty node V_NONE
  80. func (self *Node) Exists() bool {
  81. return self.Valid() && self.t != _V_NONE
  82. }
  83. // Valid reports if self is NOT V_ERROR or nil
  84. func (self *Node) Valid() bool {
  85. if self == nil {
  86. return false
  87. }
  88. return self.t != V_ERROR
  89. }
  90. // Check checks if the node itself is valid, and return:
  91. // - ErrNotExist If the node is nil
  92. // - Its underlying error If the node is V_ERROR
  93. func (self *Node) Check() error {
  94. if self == nil {
  95. return ErrNotExist
  96. } else if self.t != V_ERROR {
  97. return nil
  98. } else {
  99. return self
  100. }
  101. }
  102. // IsRaw returns true if node's underlying value is raw json
  103. func (self Node) IsRaw() bool {
  104. return self.t&_V_RAW != 0
  105. }
  106. func (self *Node) isLazy() bool {
  107. return self != nil && self.t&_V_LAZY != 0
  108. }
  109. func (self *Node) isAny() bool {
  110. return self != nil && self.t == _V_ANY
  111. }
  112. /** Simple Value Methods **/
  113. // Raw returns json representation of the node,
  114. func (self *Node) Raw() (string, error) {
  115. if self == nil {
  116. return "", ErrNotExist
  117. }
  118. if !self.IsRaw() {
  119. buf, err := self.MarshalJSON()
  120. return rt.Mem2Str(buf), err
  121. }
  122. return self.toString(), nil
  123. }
  124. func (self *Node) checkRaw() error {
  125. if err := self.Check(); err != nil {
  126. return err
  127. }
  128. if self.IsRaw() {
  129. self.parseRaw(false)
  130. }
  131. return self.Check()
  132. }
  133. // Bool returns bool value represented by this node,
  134. // including types.V_TRUE|V_FALSE|V_NUMBER|V_STRING|V_ANY|V_NULL,
  135. // V_NONE will return error
  136. func (self *Node) Bool() (bool, error) {
  137. if err := self.checkRaw(); err != nil {
  138. return false, err
  139. }
  140. switch self.t {
  141. case types.V_TRUE : return true , nil
  142. case types.V_FALSE : return false, nil
  143. case types.V_NULL : return false, nil
  144. case _V_NUMBER :
  145. if i, err := self.toInt64(); err == nil {
  146. return i != 0, nil
  147. } else if f, err := self.toFloat64(); err == nil {
  148. return f != 0, nil
  149. } else {
  150. return false, err
  151. }
  152. case types.V_STRING: return strconv.ParseBool(self.toString())
  153. case _V_ANY :
  154. any := self.packAny()
  155. switch v := any.(type) {
  156. case bool : return v, nil
  157. case int : return v != 0, nil
  158. case int8 : return v != 0, nil
  159. case int16 : return v != 0, nil
  160. case int32 : return v != 0, nil
  161. case int64 : return v != 0, nil
  162. case uint : return v != 0, nil
  163. case uint8 : return v != 0, nil
  164. case uint16 : return v != 0, nil
  165. case uint32 : return v != 0, nil
  166. case uint64 : return v != 0, nil
  167. case float32: return v != 0, nil
  168. case float64: return v != 0, nil
  169. case string : return strconv.ParseBool(v)
  170. case json.Number:
  171. if i, err := v.Int64(); err == nil {
  172. return i != 0, nil
  173. } else if f, err := v.Float64(); err == nil {
  174. return f != 0, nil
  175. } else {
  176. return false, err
  177. }
  178. default: return false, ErrUnsupportType
  179. }
  180. default : return false, ErrUnsupportType
  181. }
  182. }
  183. // Int64 casts the node to int64 value,
  184. // including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING
  185. // V_NONE it will return error
  186. func (self *Node) Int64() (int64, error) {
  187. if err := self.checkRaw(); err != nil {
  188. return 0, err
  189. }
  190. switch self.t {
  191. case _V_NUMBER, types.V_STRING :
  192. if i, err := self.toInt64(); err == nil {
  193. return i, nil
  194. } else if f, err := self.toFloat64(); err == nil {
  195. return int64(f), nil
  196. } else {
  197. return 0, err
  198. }
  199. case types.V_TRUE : return 1, nil
  200. case types.V_FALSE : return 0, nil
  201. case types.V_NULL : return 0, nil
  202. case _V_ANY :
  203. any := self.packAny()
  204. switch v := any.(type) {
  205. case bool : if v { return 1, nil } else { return 0, nil }
  206. case int : return int64(v), nil
  207. case int8 : return int64(v), nil
  208. case int16 : return int64(v), nil
  209. case int32 : return int64(v), nil
  210. case int64 : return int64(v), nil
  211. case uint : return int64(v), nil
  212. case uint8 : return int64(v), nil
  213. case uint16 : return int64(v), nil
  214. case uint32 : return int64(v), nil
  215. case uint64 : return int64(v), nil
  216. case float32: return int64(v), nil
  217. case float64: return int64(v), nil
  218. case string :
  219. if i, err := strconv.ParseInt(v, 10, 64); err == nil {
  220. return i, nil
  221. } else if f, err := strconv.ParseFloat(v, 64); err == nil {
  222. return int64(f), nil
  223. } else {
  224. return 0, err
  225. }
  226. case json.Number:
  227. if i, err := v.Int64(); err == nil {
  228. return i, nil
  229. } else if f, err := v.Float64(); err == nil {
  230. return int64(f), nil
  231. } else {
  232. return 0, err
  233. }
  234. default: return 0, ErrUnsupportType
  235. }
  236. default : return 0, ErrUnsupportType
  237. }
  238. }
  239. // StrictInt64 exports underlying int64 value, including V_NUMBER, V_ANY
  240. func (self *Node) StrictInt64() (int64, error) {
  241. if err := self.checkRaw(); err != nil {
  242. return 0, err
  243. }
  244. switch self.t {
  245. case _V_NUMBER : return self.toInt64()
  246. case _V_ANY :
  247. any := self.packAny()
  248. switch v := any.(type) {
  249. case int : return int64(v), nil
  250. case int8 : return int64(v), nil
  251. case int16 : return int64(v), nil
  252. case int32 : return int64(v), nil
  253. case int64 : return int64(v), nil
  254. case uint : return int64(v), nil
  255. case uint8 : return int64(v), nil
  256. case uint16: return int64(v), nil
  257. case uint32: return int64(v), nil
  258. case uint64: return int64(v), nil
  259. case json.Number:
  260. if i, err := v.Int64(); err == nil {
  261. return i, nil
  262. } else {
  263. return 0, err
  264. }
  265. default: return 0, ErrUnsupportType
  266. }
  267. default : return 0, ErrUnsupportType
  268. }
  269. }
  270. func castNumber(v bool) json.Number {
  271. if v {
  272. return json.Number("1")
  273. } else {
  274. return json.Number("0")
  275. }
  276. }
  277. // Number casts node to float64,
  278. // including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
  279. // V_NONE it will return error
  280. func (self *Node) Number() (json.Number, error) {
  281. if err := self.checkRaw(); err != nil {
  282. return json.Number(""), err
  283. }
  284. switch self.t {
  285. case _V_NUMBER : return self.toNumber(), nil
  286. case types.V_STRING :
  287. if _, err := self.toInt64(); err == nil {
  288. return self.toNumber(), nil
  289. } else if _, err := self.toFloat64(); err == nil {
  290. return self.toNumber(), nil
  291. } else {
  292. return json.Number(""), err
  293. }
  294. case types.V_TRUE : return json.Number("1"), nil
  295. case types.V_FALSE : return json.Number("0"), nil
  296. case types.V_NULL : return json.Number("0"), nil
  297. case _V_ANY :
  298. any := self.packAny()
  299. switch v := any.(type) {
  300. case bool : return castNumber(v), nil
  301. case int : return castNumber(v != 0), nil
  302. case int8 : return castNumber(v != 0), nil
  303. case int16 : return castNumber(v != 0), nil
  304. case int32 : return castNumber(v != 0), nil
  305. case int64 : return castNumber(v != 0), nil
  306. case uint : return castNumber(v != 0), nil
  307. case uint8 : return castNumber(v != 0), nil
  308. case uint16 : return castNumber(v != 0), nil
  309. case uint32 : return castNumber(v != 0), nil
  310. case uint64 : return castNumber(v != 0), nil
  311. case float32: return castNumber(v != 0), nil
  312. case float64: return castNumber(v != 0), nil
  313. case string :
  314. if _, err := strconv.ParseFloat(v, 64); err == nil {
  315. return json.Number(v), nil
  316. } else {
  317. return json.Number(""), err
  318. }
  319. case json.Number: return v, nil
  320. default: return json.Number(""), ErrUnsupportType
  321. }
  322. default : return json.Number(""), ErrUnsupportType
  323. }
  324. }
  325. // Number exports underlying float64 value, including V_NUMBER, V_ANY of json.Number
  326. func (self *Node) StrictNumber() (json.Number, error) {
  327. if err := self.checkRaw(); err != nil {
  328. return json.Number(""), err
  329. }
  330. switch self.t {
  331. case _V_NUMBER : return self.toNumber() , nil
  332. case _V_ANY :
  333. if v, ok := self.packAny().(json.Number); ok {
  334. return v, nil
  335. } else {
  336. return json.Number(""), ErrUnsupportType
  337. }
  338. default : return json.Number(""), ErrUnsupportType
  339. }
  340. }
  341. // String cast node to string,
  342. // including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
  343. // V_NONE it will return error
  344. func (self *Node) String() (string, error) {
  345. if err := self.checkRaw(); err != nil {
  346. return "", err
  347. }
  348. switch self.t {
  349. case types.V_NULL : return "" , nil
  350. case types.V_TRUE : return "true" , nil
  351. case types.V_FALSE : return "false", nil
  352. case types.V_STRING, _V_NUMBER : return self.toString(), nil
  353. case _V_ANY :
  354. any := self.packAny()
  355. switch v := any.(type) {
  356. case bool : return strconv.FormatBool(v), nil
  357. case int : return strconv.Itoa(v), nil
  358. case int8 : return strconv.Itoa(int(v)), nil
  359. case int16 : return strconv.Itoa(int(v)), nil
  360. case int32 : return strconv.Itoa(int(v)), nil
  361. case int64 : return strconv.Itoa(int(v)), nil
  362. case uint : return strconv.Itoa(int(v)), nil
  363. case uint8 : return strconv.Itoa(int(v)), nil
  364. case uint16 : return strconv.Itoa(int(v)), nil
  365. case uint32 : return strconv.Itoa(int(v)), nil
  366. case uint64 : return strconv.Itoa(int(v)), nil
  367. case float32: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
  368. case float64: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
  369. case string : return v, nil
  370. case json.Number: return v.String(), nil
  371. default: return "", ErrUnsupportType
  372. }
  373. default : return "" , ErrUnsupportType
  374. }
  375. }
  376. // StrictString returns string value (unescaped), includeing V_STRING, V_ANY of string.
  377. // In other cases, it will return empty string.
  378. func (self *Node) StrictString() (string, error) {
  379. if err := self.checkRaw(); err != nil {
  380. return "", err
  381. }
  382. switch self.t {
  383. case types.V_STRING : return self.toString(), nil
  384. case _V_ANY :
  385. if v, ok := self.packAny().(string); ok {
  386. return v, nil
  387. } else {
  388. return "", ErrUnsupportType
  389. }
  390. default : return "", ErrUnsupportType
  391. }
  392. }
  393. // Float64 cast node to float64,
  394. // including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
  395. // V_NONE it will return error
  396. func (self *Node) Float64() (float64, error) {
  397. if err := self.checkRaw(); err != nil {
  398. return 0.0, err
  399. }
  400. switch self.t {
  401. case _V_NUMBER, types.V_STRING : return self.toFloat64()
  402. case types.V_TRUE : return 1.0, nil
  403. case types.V_FALSE : return 0.0, nil
  404. case types.V_NULL : return 0.0, nil
  405. case _V_ANY :
  406. any := self.packAny()
  407. switch v := any.(type) {
  408. case bool :
  409. if v {
  410. return 1.0, nil
  411. } else {
  412. return 0.0, nil
  413. }
  414. case int : return float64(v), nil
  415. case int8 : return float64(v), nil
  416. case int16 : return float64(v), nil
  417. case int32 : return float64(v), nil
  418. case int64 : return float64(v), nil
  419. case uint : return float64(v), nil
  420. case uint8 : return float64(v), nil
  421. case uint16 : return float64(v), nil
  422. case uint32 : return float64(v), nil
  423. case uint64 : return float64(v), nil
  424. case float32: return float64(v), nil
  425. case float64: return float64(v), nil
  426. case string :
  427. if f, err := strconv.ParseFloat(v, 64); err == nil {
  428. return float64(f), nil
  429. } else {
  430. return 0, err
  431. }
  432. case json.Number:
  433. if f, err := v.Float64(); err == nil {
  434. return float64(f), nil
  435. } else {
  436. return 0, err
  437. }
  438. default : return 0, ErrUnsupportType
  439. }
  440. default : return 0.0, ErrUnsupportType
  441. }
  442. }
  443. // Float64 exports underlying float64 value, includeing V_NUMBER, V_ANY
  444. func (self *Node) StrictFloat64() (float64, error) {
  445. if err := self.checkRaw(); err != nil {
  446. return 0.0, err
  447. }
  448. switch self.t {
  449. case _V_NUMBER : return self.toFloat64()
  450. case _V_ANY :
  451. any := self.packAny()
  452. switch v := any.(type) {
  453. case float32 : return float64(v), nil
  454. case float64 : return float64(v), nil
  455. default : return 0, ErrUnsupportType
  456. }
  457. default : return 0.0, ErrUnsupportType
  458. }
  459. }
  460. /** Sequencial Value Methods **/
  461. // Len returns children count of a array|object|string node
  462. // WARN: For partially loaded node, it also works but only counts the parsed children
  463. // WARN: For ARRAY|OBJECT nodes which has been conducted `UnsetXX()`, its length WON'T change
  464. func (self *Node) Len() (int, error) {
  465. if err := self.checkRaw(); err != nil {
  466. return 0, err
  467. }
  468. if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY || self.t == types.V_STRING {
  469. return int(self.l), nil
  470. } else if self.t == _V_NONE || self.t == types.V_NULL {
  471. return 0, nil
  472. } else {
  473. return 0, ErrUnsupportType
  474. }
  475. }
  476. func (self Node) len() int {
  477. return int(self.l)
  478. }
  479. // Cap returns malloc capacity of a array|object node for children
  480. func (self *Node) Cap() (int, error) {
  481. if err := self.checkRaw(); err != nil {
  482. return 0, err
  483. }
  484. switch self.t {
  485. case types.V_ARRAY: return (*linkedNodes)(self.p).Cap(), nil
  486. case types.V_OBJECT: return (*linkedPairs)(self.p).Cap(), nil
  487. case _V_ARRAY_LAZY: return (*parseArrayStack)(self.p).v.Cap(), nil
  488. case _V_OBJECT_LAZY: return (*parseObjectStack)(self.p).v.Cap(), nil
  489. case _V_NONE, types.V_NULL: return 0, nil
  490. default: return 0, ErrUnsupportType
  491. }
  492. }
  493. // Set sets the node of given key under self, and reports if the key has existed.
  494. //
  495. // If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key.
  496. func (self *Node) Set(key string, node Node) (bool, error) {
  497. if err := self.Check(); err != nil {
  498. return false, err
  499. }
  500. if err := node.Check(); err != nil {
  501. return false, err
  502. }
  503. if self.t == _V_NONE || self.t == types.V_NULL {
  504. *self = NewObject([]Pair{{key, node}})
  505. return false, nil
  506. }
  507. p := self.Get(key)
  508. if !p.Exists() {
  509. // self must be fully-loaded here
  510. if self.len() == 0 {
  511. *self = newObject(new(linkedPairs))
  512. }
  513. s := (*linkedPairs)(self.p)
  514. s.Add(Pair{key, node})
  515. self.l++
  516. return false, nil
  517. } else if err := p.Check(); err != nil {
  518. return false, err
  519. }
  520. *p = node
  521. return true, nil
  522. }
  523. // SetAny wraps val with V_ANY node, and Set() the node.
  524. func (self *Node) SetAny(key string, val interface{}) (bool, error) {
  525. return self.Set(key, NewAny(val))
  526. }
  527. // Unset RESET the node of given key under object parent, and reports if the key has existed.
  528. // WARN: After conducting `UnsetXX()`, the node's length WON'T change
  529. func (self *Node) Unset(key string) (bool, error) {
  530. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  531. return false, err
  532. }
  533. p, i := self.skipKey(key)
  534. if !p.Exists() {
  535. return false, nil
  536. } else if err := p.Check(); err != nil {
  537. return false, err
  538. }
  539. self.removePair(i)
  540. return true, nil
  541. }
  542. // SetByIndex sets the node of given index, and reports if the key has existed.
  543. //
  544. // The index must be within self's children.
  545. func (self *Node) SetByIndex(index int, node Node) (bool, error) {
  546. if err := self.Check(); err != nil {
  547. return false, err
  548. }
  549. if err := node.Check(); err != nil {
  550. return false, err
  551. }
  552. if index == 0 && (self.t == _V_NONE || self.t == types.V_NULL) {
  553. *self = NewArray([]Node{node})
  554. return false, nil
  555. }
  556. p := self.Index(index)
  557. if !p.Exists() {
  558. return false, ErrNotExist
  559. } else if err := p.Check(); err != nil {
  560. return false, err
  561. }
  562. *p = node
  563. return true, nil
  564. }
  565. // SetAny wraps val with V_ANY node, and SetByIndex() the node.
  566. func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) {
  567. return self.SetByIndex(index, NewAny(val))
  568. }
  569. // UnsetByIndex remove the node of given index
  570. // WARN: After conducting `UnsetXX()`, the node's length WON'T change
  571. func (self *Node) UnsetByIndex(index int) (bool, error) {
  572. if err := self.Check(); err != nil {
  573. return false, err
  574. }
  575. var p *Node
  576. it := self.itype()
  577. if it == types.V_ARRAY {
  578. p = self.Index(index)
  579. }else if it == types.V_OBJECT {
  580. if err := self.checkRaw(); err != nil {
  581. return false, err
  582. }
  583. pr := self.skipIndexPair(index)
  584. if pr == nil {
  585. return false, ErrNotExist
  586. }
  587. p = &pr.Value
  588. } else {
  589. return false, ErrUnsupportType
  590. }
  591. if !p.Exists() {
  592. return false, ErrNotExist
  593. }
  594. if it == types.V_ARRAY {
  595. self.removeNode(index)
  596. }else if it == types.V_OBJECT {
  597. self.removePair(index)
  598. }
  599. return true, nil
  600. }
  601. // Add appends the given node under self.
  602. //
  603. // If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0.
  604. func (self *Node) Add(node Node) error {
  605. if err := self.Check(); err != nil {
  606. return err
  607. }
  608. if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) {
  609. *self = NewArray([]Node{node})
  610. return nil
  611. }
  612. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  613. return err
  614. }
  615. s, err := self.unsafeArray()
  616. if err != nil {
  617. return err
  618. }
  619. s.Add(node)
  620. self.l++
  621. return nil
  622. }
  623. // SetAny wraps val with V_ANY node, and Add() the node.
  624. func (self *Node) AddAny(val interface{}) error {
  625. return self.Add(NewAny(val))
  626. }
  627. // GetByPath load given path on demands,
  628. // which only ensure nodes before this path got parsed.
  629. //
  630. // Note, the api expects the json is well-formed at least,
  631. // otherwise it may return unexpected result.
  632. func (self *Node) GetByPath(path ...interface{}) *Node {
  633. if !self.Valid() {
  634. return self
  635. }
  636. var s = self
  637. for _, p := range path {
  638. switch p := p.(type) {
  639. case int:
  640. s = s.Index(p)
  641. if !s.Valid() {
  642. return s
  643. }
  644. case string:
  645. s = s.Get(p)
  646. if !s.Valid() {
  647. return s
  648. }
  649. default:
  650. panic("path must be either int or string")
  651. }
  652. }
  653. return s
  654. }
  655. // Get loads given key of an object node on demands
  656. func (self *Node) Get(key string) *Node {
  657. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  658. return unwrapError(err)
  659. }
  660. n, _ := self.skipKey(key)
  661. return n
  662. }
  663. // Index indexies node at given idx,
  664. // node type CAN be either V_OBJECT or V_ARRAY
  665. // WARN: After conducting `UnsetXX()`, the node's length WON'T change,
  666. // thus its children's indexing WON'T change too
  667. func (self *Node) Index(idx int) *Node {
  668. if err := self.checkRaw(); err != nil {
  669. return unwrapError(err)
  670. }
  671. it := self.itype()
  672. if it == types.V_ARRAY {
  673. return self.skipIndex(idx)
  674. }else if it == types.V_OBJECT {
  675. pr := self.skipIndexPair(idx)
  676. if pr == nil {
  677. return newError(_ERR_NOT_FOUND, "value not exists")
  678. }
  679. return &pr.Value
  680. } else {
  681. return newError(_ERR_UNSUPPORT_TYPE, fmt.Sprintf("unsupported type: %v", self.itype()))
  682. }
  683. }
  684. // IndexPair indexies pair at given idx,
  685. // node type MUST be either V_OBJECT
  686. // WARN: After conducting `UnsetXX()`, the node's length WON'T change,
  687. // thus its children's indexing WON'T change too
  688. func (self *Node) IndexPair(idx int) *Pair {
  689. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  690. return nil
  691. }
  692. return self.skipIndexPair(idx)
  693. }
  694. // IndexOrGet firstly use idx to index a value and check if its key matches
  695. // If not, then use the key to search value
  696. func (self *Node) IndexOrGet(idx int, key string) *Node {
  697. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  698. return unwrapError(err)
  699. }
  700. pr := self.skipIndexPair(idx)
  701. if pr != nil && pr.Key == key {
  702. return &pr.Value
  703. }
  704. n, _ := self.skipKey(key)
  705. return n
  706. }
  707. /** Generic Value Converters **/
  708. // Map loads all keys of an object node
  709. func (self *Node) Map() (map[string]interface{}, error) {
  710. if self.isAny() {
  711. any := self.packAny()
  712. if v, ok := any.(map[string]interface{}); ok {
  713. return v, nil
  714. } else {
  715. return nil, ErrUnsupportType
  716. }
  717. }
  718. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  719. return nil, err
  720. }
  721. if err := self.loadAllKey(); err != nil {
  722. return nil, err
  723. }
  724. return self.toGenericObject()
  725. }
  726. // MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number
  727. func (self *Node) MapUseNumber() (map[string]interface{}, error) {
  728. if self.isAny() {
  729. any := self.packAny()
  730. if v, ok := any.(map[string]interface{}); ok {
  731. return v, nil
  732. } else {
  733. return nil, ErrUnsupportType
  734. }
  735. }
  736. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  737. return nil, err
  738. }
  739. if err := self.loadAllKey(); err != nil {
  740. return nil, err
  741. }
  742. return self.toGenericObjectUseNumber()
  743. }
  744. // MapUseNode scans both parsed and non-parsed chidren nodes,
  745. // and map them by their keys
  746. func (self *Node) MapUseNode() (map[string]Node, error) {
  747. if self.isAny() {
  748. any := self.packAny()
  749. if v, ok := any.(map[string]Node); ok {
  750. return v, nil
  751. } else {
  752. return nil, ErrUnsupportType
  753. }
  754. }
  755. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  756. return nil, err
  757. }
  758. if err := self.skipAllKey(); err != nil {
  759. return nil, err
  760. }
  761. return self.toGenericObjectUseNode()
  762. }
  763. // MapUnsafe exports the underlying pointer to its children map
  764. // WARN: don't use it unless you know what you are doing
  765. //
  766. // Deprecated: this API now returns copied nodes instead of directly reference,
  767. // func (self *Node) UnsafeMap() ([]Pair, error) {
  768. // if err := self.should(types.V_OBJECT, "an object"); err != nil {
  769. // return nil, err
  770. // }
  771. // if err := self.skipAllKey(); err != nil {
  772. // return nil, err
  773. // }
  774. // return self.toGenericObjectUsePair()
  775. // }
  776. //go:nocheckptr
  777. func (self *Node) unsafeMap() (*linkedPairs, error) {
  778. if err := self.skipAllKey(); err != nil {
  779. return nil, err
  780. }
  781. if self.p == nil {
  782. *self = newObject(new(linkedPairs))
  783. }
  784. return (*linkedPairs)(self.p), nil
  785. }
  786. // SortKeys sorts children of a V_OBJECT node in ascending key-order.
  787. // If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found.
  788. func (self *Node) SortKeys(recurse bool) error {
  789. // check raw node first
  790. if err := self.checkRaw(); err != nil {
  791. return err
  792. }
  793. if self.itype() == types.V_OBJECT {
  794. return self.sortKeys(recurse)
  795. } else {
  796. var err error
  797. err2 := self.ForEach(func(path Sequence, node *Node) bool {
  798. it := node.itype()
  799. if it == types.V_ARRAY || it == types.V_OBJECT {
  800. err = node.SortKeys(recurse)
  801. if err != nil {
  802. return false
  803. }
  804. }
  805. return true
  806. })
  807. if err != nil {
  808. return err
  809. }
  810. return err2
  811. }
  812. }
  813. func (self *Node) sortKeys(recurse bool) (err error) {
  814. ps, err := self.unsafeMap()
  815. if err != nil {
  816. return err
  817. }
  818. ps.Sort()
  819. if recurse {
  820. var sc Scanner
  821. sc = func(path Sequence, node *Node) bool {
  822. if node.itype() == types.V_OBJECT {
  823. if err := node.sortKeys(recurse); err != nil {
  824. return false
  825. }
  826. }
  827. if node.itype() == types.V_ARRAY {
  828. if err := node.ForEach(sc); err != nil {
  829. return false
  830. }
  831. }
  832. return true
  833. }
  834. if err := self.ForEach(sc); err != nil {
  835. return err
  836. }
  837. }
  838. return nil
  839. }
  840. // Array loads all indexes of an array node
  841. func (self *Node) Array() ([]interface{}, error) {
  842. if self.isAny() {
  843. any := self.packAny()
  844. if v, ok := any.([]interface{}); ok {
  845. return v, nil
  846. } else {
  847. return nil, ErrUnsupportType
  848. }
  849. }
  850. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  851. return nil, err
  852. }
  853. if err := self.loadAllIndex(); err != nil {
  854. return nil, err
  855. }
  856. return self.toGenericArray()
  857. }
  858. // ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number
  859. func (self *Node) ArrayUseNumber() ([]interface{}, error) {
  860. if self.isAny() {
  861. any := self.packAny()
  862. if v, ok := any.([]interface{}); ok {
  863. return v, nil
  864. } else {
  865. return nil, ErrUnsupportType
  866. }
  867. }
  868. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  869. return nil, err
  870. }
  871. if err := self.loadAllIndex(); err != nil {
  872. return nil, err
  873. }
  874. return self.toGenericArrayUseNumber()
  875. }
  876. // ArrayUseNode copys both parsed and non-parsed chidren nodes,
  877. // and indexes them by original order
  878. func (self *Node) ArrayUseNode() ([]Node, error) {
  879. if self.isAny() {
  880. any := self.packAny()
  881. if v, ok := any.([]Node); ok {
  882. return v, nil
  883. } else {
  884. return nil, ErrUnsupportType
  885. }
  886. }
  887. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  888. return nil, err
  889. }
  890. if err := self.skipAllIndex(); err != nil {
  891. return nil, err
  892. }
  893. return self.toGenericArrayUseNode()
  894. }
  895. // ArrayUnsafe exports the underlying pointer to its children array
  896. // WARN: don't use it unless you know what you are doing
  897. //
  898. // Deprecated: this API now returns copied nodes instead of directly reference,
  899. // which has no difference with ArrayUseNode
  900. // func (self *Node) UnsafeArray() ([]Node, error) {
  901. // if err := self.should(types.V_ARRAY, "an array"); err != nil {
  902. // return nil, err
  903. // }
  904. // if err := self.skipAllIndex(); err != nil {
  905. // return nil, err
  906. // }
  907. // return self.toGenericArrayUseNode()
  908. // }
  909. func (self *Node) unsafeArray() (*linkedNodes, error) {
  910. if err := self.skipAllIndex(); err != nil {
  911. return nil, err
  912. }
  913. if self.p == nil {
  914. *self = newArray(new(linkedNodes))
  915. }
  916. return (*linkedNodes)(self.p), nil
  917. }
  918. // Interface loads all children under all pathes from this node,
  919. // and converts itself as generic type.
  920. // WARN: all numberic nodes are casted to float64
  921. func (self *Node) Interface() (interface{}, error) {
  922. if err := self.checkRaw(); err != nil {
  923. return nil, err
  924. }
  925. switch self.t {
  926. case V_ERROR : return nil, self.Check()
  927. case types.V_NULL : return nil, nil
  928. case types.V_TRUE : return true, nil
  929. case types.V_FALSE : return false, nil
  930. case types.V_ARRAY : return self.toGenericArray()
  931. case types.V_OBJECT : return self.toGenericObject()
  932. case types.V_STRING : return self.toString(), nil
  933. case _V_NUMBER :
  934. v, err := self.toFloat64()
  935. if err != nil {
  936. return nil, err
  937. }
  938. return v, nil
  939. case _V_ARRAY_LAZY :
  940. if err := self.loadAllIndex(); err != nil {
  941. return nil, err
  942. }
  943. return self.toGenericArray()
  944. case _V_OBJECT_LAZY :
  945. if err := self.loadAllKey(); err != nil {
  946. return nil, err
  947. }
  948. return self.toGenericObject()
  949. case _V_ANY:
  950. switch v := self.packAny().(type) {
  951. case Node : return v.Interface()
  952. case *Node: return v.Interface()
  953. default : return v, nil
  954. }
  955. default : return nil, ErrUnsupportType
  956. }
  957. }
  958. func (self *Node) packAny() interface{} {
  959. return *(*interface{})(self.p)
  960. }
  961. // InterfaceUseNumber works same with Interface()
  962. // except numberic nodes are casted to json.Number
  963. func (self *Node) InterfaceUseNumber() (interface{}, error) {
  964. if err := self.checkRaw(); err != nil {
  965. return nil, err
  966. }
  967. switch self.t {
  968. case V_ERROR : return nil, self.Check()
  969. case types.V_NULL : return nil, nil
  970. case types.V_TRUE : return true, nil
  971. case types.V_FALSE : return false, nil
  972. case types.V_ARRAY : return self.toGenericArrayUseNumber()
  973. case types.V_OBJECT : return self.toGenericObjectUseNumber()
  974. case types.V_STRING : return self.toString(), nil
  975. case _V_NUMBER : return self.toNumber(), nil
  976. case _V_ARRAY_LAZY :
  977. if err := self.loadAllIndex(); err != nil {
  978. return nil, err
  979. }
  980. return self.toGenericArrayUseNumber()
  981. case _V_OBJECT_LAZY :
  982. if err := self.loadAllKey(); err != nil {
  983. return nil, err
  984. }
  985. return self.toGenericObjectUseNumber()
  986. case _V_ANY : return self.packAny(), nil
  987. default : return nil, ErrUnsupportType
  988. }
  989. }
  990. // InterfaceUseNode clone itself as a new node,
  991. // or its children as map[string]Node (or []Node)
  992. func (self *Node) InterfaceUseNode() (interface{}, error) {
  993. if err := self.checkRaw(); err != nil {
  994. return nil, err
  995. }
  996. switch self.t {
  997. case types.V_ARRAY : return self.toGenericArrayUseNode()
  998. case types.V_OBJECT : return self.toGenericObjectUseNode()
  999. case _V_ARRAY_LAZY :
  1000. if err := self.skipAllIndex(); err != nil {
  1001. return nil, err
  1002. }
  1003. return self.toGenericArrayUseNode()
  1004. case _V_OBJECT_LAZY :
  1005. if err := self.skipAllKey(); err != nil {
  1006. return nil, err
  1007. }
  1008. return self.toGenericObjectUseNode()
  1009. default : return *self, self.Check()
  1010. }
  1011. }
  1012. // LoadAll loads all the node's children and children's children as parsed.
  1013. // After calling it, the node can be safely used on concurrency
  1014. func (self *Node) LoadAll() error {
  1015. if self.IsRaw() {
  1016. self.parseRaw(true)
  1017. return self.Check()
  1018. }
  1019. switch self.itype() {
  1020. case types.V_ARRAY:
  1021. e := self.len()
  1022. if err := self.loadAllIndex(); err != nil {
  1023. return err
  1024. }
  1025. for i := 0; i < e; i++ {
  1026. n := self.nodeAt(i)
  1027. if n.IsRaw() {
  1028. n.parseRaw(true)
  1029. }
  1030. if err := n.Check(); err != nil {
  1031. return err
  1032. }
  1033. }
  1034. return nil
  1035. case types.V_OBJECT:
  1036. e := self.len()
  1037. if err := self.loadAllKey(); err != nil {
  1038. return err
  1039. }
  1040. for i := 0; i < e; i++ {
  1041. n := self.pairAt(i)
  1042. if n.Value.IsRaw() {
  1043. n.Value.parseRaw(true)
  1044. }
  1045. if err := n.Value.Check(); err != nil {
  1046. return err
  1047. }
  1048. }
  1049. return nil
  1050. default:
  1051. return self.Check()
  1052. }
  1053. }
  1054. // Load loads the node's children as parsed.
  1055. // After calling it, only the node itself can be used on concurrency (not include its children)
  1056. func (self *Node) Load() error {
  1057. if err := self.checkRaw(); err != nil {
  1058. return err
  1059. }
  1060. switch self.t {
  1061. case _V_ARRAY_LAZY:
  1062. return self.skipAllIndex()
  1063. case _V_OBJECT_LAZY:
  1064. return self.skipAllKey()
  1065. default:
  1066. return self.Check()
  1067. }
  1068. }
  1069. /**---------------------------------- Internal Helper Methods ----------------------------------**/
  1070. func (self *Node) should(t types.ValueType, s string) error {
  1071. if err := self.checkRaw(); err != nil {
  1072. return err
  1073. }
  1074. if self.itype() != t {
  1075. return ErrUnsupportType
  1076. }
  1077. return nil
  1078. }
  1079. func (self *Node) nodeAt(i int) *Node {
  1080. var p *linkedNodes
  1081. if self.isLazy() {
  1082. _, stack := self.getParserAndArrayStack()
  1083. p = &stack.v
  1084. } else {
  1085. p = (*linkedNodes)(self.p)
  1086. }
  1087. return p.At(i)
  1088. }
  1089. func (self *Node) pairAt(i int) *Pair {
  1090. var p *linkedPairs
  1091. if self.isLazy() {
  1092. _, stack := self.getParserAndObjectStack()
  1093. p = &stack.v
  1094. } else {
  1095. p = (*linkedPairs)(self.p)
  1096. }
  1097. return p.At(i)
  1098. }
  1099. func (self *Node) skipAllIndex() error {
  1100. if !self.isLazy() {
  1101. return nil
  1102. }
  1103. var err types.ParsingError
  1104. parser, stack := self.getParserAndArrayStack()
  1105. parser.skipValue = true
  1106. parser.noLazy = true
  1107. *self, err = parser.decodeArray(&stack.v)
  1108. if err != 0 {
  1109. return parser.ExportError(err)
  1110. }
  1111. return nil
  1112. }
  1113. func (self *Node) skipAllKey() error {
  1114. if !self.isLazy() {
  1115. return nil
  1116. }
  1117. var err types.ParsingError
  1118. parser, stack := self.getParserAndObjectStack()
  1119. parser.skipValue = true
  1120. parser.noLazy = true
  1121. *self, err = parser.decodeObject(&stack.v)
  1122. if err != 0 {
  1123. return parser.ExportError(err)
  1124. }
  1125. return nil
  1126. }
  1127. func (self *Node) skipKey(key string) (*Node, int) {
  1128. nb := self.len()
  1129. lazy := self.isLazy()
  1130. if nb > 0 {
  1131. /* linear search */
  1132. var p *Pair
  1133. var i int
  1134. if lazy {
  1135. s := (*parseObjectStack)(self.p)
  1136. p, i = s.v.Get(key)
  1137. } else {
  1138. p, i = (*linkedPairs)(self.p).Get(key)
  1139. }
  1140. if p != nil {
  1141. return &p.Value, i
  1142. }
  1143. }
  1144. /* not found */
  1145. if !lazy {
  1146. return nil, -1
  1147. }
  1148. // lazy load
  1149. for last, i := self.skipNextPair(), nb; last != nil; last, i = self.skipNextPair(), i+1 {
  1150. if last.Value.Check() != nil {
  1151. return &last.Value, -1
  1152. }
  1153. if last.Key == key {
  1154. return &last.Value, i
  1155. }
  1156. }
  1157. return nil, -1
  1158. }
  1159. func (self *Node) skipIndex(index int) *Node {
  1160. nb := self.len()
  1161. if nb > index {
  1162. v := self.nodeAt(index)
  1163. return v
  1164. }
  1165. if !self.isLazy() {
  1166. return nil
  1167. }
  1168. // lazy load
  1169. for last := self.skipNextNode(); last != nil; last = self.skipNextNode(){
  1170. if last.Check() != nil {
  1171. return last
  1172. }
  1173. if self.len() > index {
  1174. return last
  1175. }
  1176. }
  1177. return nil
  1178. }
  1179. func (self *Node) skipIndexPair(index int) *Pair {
  1180. nb := self.len()
  1181. if nb > index {
  1182. return self.pairAt(index)
  1183. }
  1184. if !self.isLazy() {
  1185. return nil
  1186. }
  1187. // lazy load
  1188. for last := self.skipNextPair(); last != nil; last = self.skipNextPair(){
  1189. if last.Value.Check() != nil {
  1190. return last
  1191. }
  1192. if self.len() > index {
  1193. return last
  1194. }
  1195. }
  1196. return nil
  1197. }
  1198. func (self *Node) loadAllIndex() error {
  1199. if !self.isLazy() {
  1200. return nil
  1201. }
  1202. var err types.ParsingError
  1203. parser, stack := self.getParserAndArrayStack()
  1204. parser.noLazy = true
  1205. *self, err = parser.decodeArray(&stack.v)
  1206. if err != 0 {
  1207. return parser.ExportError(err)
  1208. }
  1209. return nil
  1210. }
  1211. func (self *Node) loadAllKey() error {
  1212. if !self.isLazy() {
  1213. return nil
  1214. }
  1215. var err types.ParsingError
  1216. parser, stack := self.getParserAndObjectStack()
  1217. parser.noLazy = true
  1218. *self, err = parser.decodeObject(&stack.v)
  1219. if err != 0 {
  1220. return parser.ExportError(err)
  1221. }
  1222. return nil
  1223. }
  1224. func (self *Node) removeNode(i int) {
  1225. node := self.nodeAt(i)
  1226. if node == nil {
  1227. return
  1228. }
  1229. *node = Node{}
  1230. // NOTICE: for consistency with linkedNodes, we DOSEN'T reduce size here
  1231. // self.l--
  1232. }
  1233. func (self *Node) removePair(i int) {
  1234. last := self.pairAt(i)
  1235. if last == nil {
  1236. return
  1237. }
  1238. *last = Pair{}
  1239. // NOTICE: for consistency with linkedNodes, we DOSEN'T reduce size here
  1240. // self.l--
  1241. }
  1242. func (self *Node) toGenericArray() ([]interface{}, error) {
  1243. nb := self.len()
  1244. if nb == 0 {
  1245. return []interface{}{}, nil
  1246. }
  1247. ret := make([]interface{}, nb)
  1248. /* convert each item */
  1249. var s = (*linkedNodes)(self.p)
  1250. for i := 0; i < nb; i++ {
  1251. p := s.At(i)
  1252. x, err := p.Interface()
  1253. if err != nil {
  1254. return nil, err
  1255. }
  1256. ret[i] = x
  1257. }
  1258. /* all done */
  1259. return ret, nil
  1260. }
  1261. func (self *Node) toGenericArrayUseNumber() ([]interface{}, error) {
  1262. nb := self.len()
  1263. if nb == 0 {
  1264. return []interface{}{}, nil
  1265. }
  1266. ret := make([]interface{}, nb)
  1267. /* convert each item */
  1268. var s = (*linkedNodes)(self.p)
  1269. for i := 0; i < nb; i++ {
  1270. p := s.At(i)
  1271. x, err := p.InterfaceUseNumber()
  1272. if err != nil {
  1273. return nil, err
  1274. }
  1275. ret[i] = x
  1276. }
  1277. /* all done */
  1278. return ret, nil
  1279. }
  1280. func (self *Node) toGenericArrayUseNode() ([]Node, error) {
  1281. var nb = self.len()
  1282. if nb == 0 {
  1283. return []Node{}, nil
  1284. }
  1285. var s = (*linkedNodes)(self.p)
  1286. var out = make([]Node, nb)
  1287. s.ToSlice(out)
  1288. return out, nil
  1289. }
  1290. func (self *Node) toGenericObject() (map[string]interface{}, error) {
  1291. nb := self.len()
  1292. if nb == 0 {
  1293. return map[string]interface{}{}, nil
  1294. }
  1295. ret := make(map[string]interface{}, nb)
  1296. /* convert each item */
  1297. var s = (*linkedPairs)(self.p)
  1298. for i := 0; i < nb; i++ {
  1299. p := s.At(i)
  1300. x, err := p.Value.Interface()
  1301. if err != nil {
  1302. return nil, err
  1303. }
  1304. ret[p.Key] = x
  1305. }
  1306. /* all done */
  1307. return ret, nil
  1308. }
  1309. func (self *Node) toGenericObjectUseNumber() (map[string]interface{}, error) {
  1310. nb := self.len()
  1311. if nb == 0 {
  1312. return map[string]interface{}{}, nil
  1313. }
  1314. ret := make(map[string]interface{}, nb)
  1315. /* convert each item */
  1316. var s = (*linkedPairs)(self.p)
  1317. for i := 0; i < nb; i++ {
  1318. p := s.At(i)
  1319. x, err := p.Value.InterfaceUseNumber()
  1320. if err != nil {
  1321. return nil, err
  1322. }
  1323. ret[p.Key] = x
  1324. }
  1325. /* all done */
  1326. return ret, nil
  1327. }
  1328. func (self *Node) toGenericObjectUseNode() (map[string]Node, error) {
  1329. var nb = self.len()
  1330. if nb == 0 {
  1331. return map[string]Node{}, nil
  1332. }
  1333. var s = (*linkedPairs)(self.p)
  1334. var out = make(map[string]Node, nb)
  1335. s.ToMap(out)
  1336. /* all done */
  1337. return out, nil
  1338. }
  1339. /**------------------------------------ Factory Methods ------------------------------------**/
  1340. var (
  1341. nullNode = Node{t: types.V_NULL}
  1342. trueNode = Node{t: types.V_TRUE}
  1343. falseNode = Node{t: types.V_FALSE}
  1344. )
  1345. // NewRaw creates a node of raw json.
  1346. // If the input json is invalid, NewRaw returns a error Node.
  1347. func NewRaw(json string) Node {
  1348. parser := NewParserObj(json)
  1349. start, err := parser.skip()
  1350. if err != 0 {
  1351. return *newError(err, err.Message())
  1352. }
  1353. it := switchRawType(parser.s[start])
  1354. if it == _V_NONE {
  1355. return Node{}
  1356. }
  1357. return newRawNode(parser.s[start:parser.p], it)
  1358. }
  1359. // NewAny creates a node of type V_ANY if any's type isn't Node or *Node,
  1360. // which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`.
  1361. func NewAny(any interface{}) Node {
  1362. switch n := any.(type) {
  1363. case Node:
  1364. return n
  1365. case *Node:
  1366. return *n
  1367. default:
  1368. return Node{
  1369. t: _V_ANY,
  1370. p: unsafe.Pointer(&any),
  1371. }
  1372. }
  1373. }
  1374. // NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING.
  1375. func NewBytes(src []byte) Node {
  1376. if len(src) == 0 {
  1377. panic("empty src bytes")
  1378. }
  1379. out := encodeBase64(src)
  1380. return NewString(out)
  1381. }
  1382. // NewNull creates a node of type V_NULL
  1383. func NewNull() Node {
  1384. return Node{
  1385. p: nil,
  1386. t: types.V_NULL,
  1387. }
  1388. }
  1389. // NewBool creates a node of type bool:
  1390. // If v is true, returns V_TRUE node
  1391. // If v is false, returns V_FALSE node
  1392. func NewBool(v bool) Node {
  1393. var t = types.V_FALSE
  1394. if v {
  1395. t = types.V_TRUE
  1396. }
  1397. return Node{
  1398. p: nil,
  1399. t: t,
  1400. }
  1401. }
  1402. // NewNumber creates a json.Number node
  1403. // v must be a decimal string complying with RFC8259
  1404. func NewNumber(v string) Node {
  1405. return Node{
  1406. l: uint(len(v)),
  1407. p: rt.StrPtr(v),
  1408. t: _V_NUMBER,
  1409. }
  1410. }
  1411. func (node Node) toNumber() json.Number {
  1412. return json.Number(rt.StrFrom(node.p, int64(node.l)))
  1413. }
  1414. func (self Node) toString() string {
  1415. return rt.StrFrom(self.p, int64(self.l))
  1416. }
  1417. func (node Node) toFloat64() (float64, error) {
  1418. ret, err := node.toNumber().Float64()
  1419. if err != nil {
  1420. return 0, err
  1421. }
  1422. return ret, nil
  1423. }
  1424. func (node Node) toInt64() (int64, error) {
  1425. ret,err := node.toNumber().Int64()
  1426. if err != nil {
  1427. return 0, err
  1428. }
  1429. return ret, nil
  1430. }
  1431. func newBytes(v []byte) Node {
  1432. return Node{
  1433. t: types.V_STRING,
  1434. p: mem2ptr(v),
  1435. l: uint(len(v)),
  1436. }
  1437. }
  1438. // NewString creates a node of type V_STRING.
  1439. // v is considered to be a valid UTF-8 string,
  1440. // which means it won't be validated and unescaped.
  1441. // when the node is encoded to json, v will be escaped.
  1442. func NewString(v string) Node {
  1443. return Node{
  1444. t: types.V_STRING,
  1445. p: rt.StrPtr(v),
  1446. l: uint(len(v)),
  1447. }
  1448. }
  1449. // NewArray creates a node of type V_ARRAY,
  1450. // using v as its underlying children
  1451. func NewArray(v []Node) Node {
  1452. s := new(linkedNodes)
  1453. s.FromSlice(v)
  1454. return newArray(s)
  1455. }
  1456. func newArray(v *linkedNodes) Node {
  1457. return Node{
  1458. t: types.V_ARRAY,
  1459. l: uint(v.Len()),
  1460. p: unsafe.Pointer(v),
  1461. }
  1462. }
  1463. func (self *Node) setArray(v *linkedNodes) {
  1464. self.t = types.V_ARRAY
  1465. self.l = uint(v.Len())
  1466. self.p = unsafe.Pointer(v)
  1467. }
  1468. // NewObject creates a node of type V_OBJECT,
  1469. // using v as its underlying children
  1470. func NewObject(v []Pair) Node {
  1471. s := new(linkedPairs)
  1472. s.FromSlice(v)
  1473. return newObject(s)
  1474. }
  1475. func newObject(v *linkedPairs) Node {
  1476. return Node{
  1477. t: types.V_OBJECT,
  1478. l: uint(v.Len()),
  1479. p: unsafe.Pointer(v),
  1480. }
  1481. }
  1482. func (self *Node) setObject(v *linkedPairs) {
  1483. self.t = types.V_OBJECT
  1484. self.l = uint(v.Len())
  1485. self.p = unsafe.Pointer(v)
  1486. }
  1487. func newRawNode(str string, typ types.ValueType) Node {
  1488. return Node{
  1489. t: _V_RAW | typ,
  1490. p: rt.StrPtr(str),
  1491. l: uint(len(str)),
  1492. }
  1493. }
  1494. func (self *Node) parseRaw(full bool) {
  1495. raw := self.toString()
  1496. parser := NewParserObj(raw)
  1497. if full {
  1498. parser.noLazy = true
  1499. parser.skipValue = false
  1500. }
  1501. var e types.ParsingError
  1502. *self, e = parser.Parse()
  1503. if e != 0 {
  1504. *self = *newSyntaxError(parser.syntaxError(e))
  1505. }
  1506. }
  1507. var typeJumpTable = [256]types.ValueType{
  1508. '"' : types.V_STRING,
  1509. '-' : _V_NUMBER,
  1510. '0' : _V_NUMBER,
  1511. '1' : _V_NUMBER,
  1512. '2' : _V_NUMBER,
  1513. '3' : _V_NUMBER,
  1514. '4' : _V_NUMBER,
  1515. '5' : _V_NUMBER,
  1516. '6' : _V_NUMBER,
  1517. '7' : _V_NUMBER,
  1518. '8' : _V_NUMBER,
  1519. '9' : _V_NUMBER,
  1520. '[' : types.V_ARRAY,
  1521. 'f' : types.V_FALSE,
  1522. 'n' : types.V_NULL,
  1523. 't' : types.V_TRUE,
  1524. '{' : types.V_OBJECT,
  1525. }
  1526. func switchRawType(c byte) types.ValueType {
  1527. return typeJumpTable[c]
  1528. }