node.go 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824
  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. func (self *Node) Len() (int, error) {
  464. if err := self.checkRaw(); err != nil {
  465. return 0, err
  466. }
  467. 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 {
  468. return int(self.l), nil
  469. } else if self.t == _V_NONE || self.t == types.V_NULL {
  470. return 0, nil
  471. } else {
  472. return 0, ErrUnsupportType
  473. }
  474. }
  475. func (self Node) len() int {
  476. return int(self.l)
  477. }
  478. // Cap returns malloc capacity of a array|object node for children
  479. func (self *Node) Cap() (int, error) {
  480. if err := self.checkRaw(); err != nil {
  481. return 0, err
  482. }
  483. switch self.t {
  484. case types.V_ARRAY: return (*linkedNodes)(self.p).Cap(), nil
  485. case types.V_OBJECT: return (*linkedPairs)(self.p).Cap(), nil
  486. case _V_ARRAY_LAZY: return (*parseArrayStack)(self.p).v.Cap(), nil
  487. case _V_OBJECT_LAZY: return (*parseObjectStack)(self.p).v.Cap(), nil
  488. case _V_NONE, types.V_NULL: return 0, nil
  489. default: return 0, ErrUnsupportType
  490. }
  491. }
  492. // Set sets the node of given key under self, and reports if the key has existed.
  493. //
  494. // If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key.
  495. func (self *Node) Set(key string, node Node) (bool, error) {
  496. if err := self.Check(); err != nil {
  497. return false, err
  498. }
  499. if err := node.Check(); err != nil {
  500. return false, err
  501. }
  502. if self.t == _V_NONE || self.t == types.V_NULL {
  503. *self = NewObject([]Pair{{key, node}})
  504. return false, nil
  505. } else if self.itype() != types.V_OBJECT {
  506. return false, ErrUnsupportType
  507. }
  508. p := self.Get(key)
  509. if !p.Exists() {
  510. // self must be fully-loaded here
  511. if self.len() == 0 {
  512. *self = newObject(new(linkedPairs))
  513. }
  514. s := (*linkedPairs)(self.p)
  515. s.Push(Pair{key, node})
  516. self.l++
  517. return false, nil
  518. } else if err := p.Check(); err != nil {
  519. return false, err
  520. }
  521. *p = node
  522. return true, nil
  523. }
  524. // SetAny wraps val with V_ANY node, and Set() the node.
  525. func (self *Node) SetAny(key string, val interface{}) (bool, error) {
  526. return self.Set(key, NewAny(val))
  527. }
  528. // Unset REMOVE (soft) the node of given key under object parent, and reports if the key has existed.
  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. // NOTICE: must get acurate length before deduct
  534. if err := self.skipAllKey(); err != nil {
  535. return false, err
  536. }
  537. p, i := self.skipKey(key)
  538. if !p.Exists() {
  539. return false, nil
  540. } else if err := p.Check(); err != nil {
  541. return false, err
  542. }
  543. self.removePairAt(i)
  544. return true, nil
  545. }
  546. // SetByIndex sets the node of given index, and reports if the key has existed.
  547. //
  548. // The index must be within self's children.
  549. func (self *Node) SetByIndex(index int, node Node) (bool, error) {
  550. if err := self.Check(); err != nil {
  551. return false, err
  552. }
  553. if err := node.Check(); err != nil {
  554. return false, err
  555. }
  556. if index == 0 && (self.t == _V_NONE || self.t == types.V_NULL) {
  557. *self = NewArray([]Node{node})
  558. return false, nil
  559. }
  560. p := self.Index(index)
  561. if !p.Exists() {
  562. return false, ErrNotExist
  563. } else if err := p.Check(); err != nil {
  564. return false, err
  565. }
  566. *p = node
  567. return true, nil
  568. }
  569. // SetAny wraps val with V_ANY node, and SetByIndex() the node.
  570. func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) {
  571. return self.SetByIndex(index, NewAny(val))
  572. }
  573. // UnsetByIndex REOMVE (softly) the node of given index.
  574. //
  575. // WARN: this will change address of elements, which is a dangerous action.
  576. // Use Unset() for object or Pop() for array instead.
  577. func (self *Node) UnsetByIndex(index int) (bool, error) {
  578. if err := self.checkRaw(); err != nil {
  579. return false, err
  580. }
  581. var p *Node
  582. it := self.itype()
  583. if it == types.V_ARRAY {
  584. if err := self.skipAllIndex(); err != nil {
  585. return false, err
  586. }
  587. p = self.nodeAt(index)
  588. } else if it == types.V_OBJECT {
  589. if err := self.skipAllKey(); err != nil {
  590. return false, err
  591. }
  592. pr := self.pairAt(index)
  593. if pr == nil {
  594. return false, ErrNotExist
  595. }
  596. p = &pr.Value
  597. } else {
  598. return false, ErrUnsupportType
  599. }
  600. if !p.Exists() {
  601. return false, ErrNotExist
  602. }
  603. // last elem
  604. if index == self.len() - 1 {
  605. return true, self.Pop()
  606. }
  607. // not last elem, self.len() change but linked-chunk not change
  608. if it == types.V_ARRAY {
  609. self.removeNode(index)
  610. }else if it == types.V_OBJECT {
  611. self.removePair(index)
  612. }
  613. return true, nil
  614. }
  615. // Add appends the given node under self.
  616. //
  617. // If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0.
  618. func (self *Node) Add(node Node) error {
  619. if err := self.Check(); err != nil {
  620. return err
  621. }
  622. if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) {
  623. *self = NewArray([]Node{node})
  624. return nil
  625. }
  626. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  627. return err
  628. }
  629. s, err := self.unsafeArray()
  630. if err != nil {
  631. return err
  632. }
  633. // Notice: array won't have unset node in tail
  634. s.Push(node)
  635. self.l++
  636. return nil
  637. }
  638. // Pop remove the last child of the V_Array or V_Object node.
  639. func (self *Node) Pop() error {
  640. if err := self.checkRaw(); err != nil {
  641. return err
  642. }
  643. if it := self.itype(); it == types.V_ARRAY {
  644. s, err := self.unsafeArray()
  645. if err != nil {
  646. return err
  647. }
  648. // remove tail unset nodes
  649. for i := s.Len()-1; i >= 0; i-- {
  650. if s.At(i).Exists() {
  651. s.Pop()
  652. self.l--
  653. break
  654. }
  655. s.Pop()
  656. }
  657. } else if it == types.V_OBJECT {
  658. s, err := self.unsafeMap()
  659. if err != nil {
  660. return err
  661. }
  662. // remove tail unset nodes
  663. for i := s.Len()-1; i >= 0; i-- {
  664. if p := s.At(i); p != nil && p.Value.Exists() {
  665. s.Pop()
  666. self.l--
  667. break
  668. }
  669. s.Pop()
  670. }
  671. } else {
  672. return ErrUnsupportType
  673. }
  674. return nil
  675. }
  676. // Move moves the child at src index to dst index,
  677. // meanwhile slides sliblings from src+1 to dst.
  678. //
  679. // WARN: this will change address of elements, which is a dangerous action.
  680. func (self *Node) Move(dst, src int) error {
  681. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  682. return err
  683. }
  684. s, err := self.unsafeArray()
  685. if err != nil {
  686. return err
  687. }
  688. // check if any unset node exists
  689. if l := s.Len(); self.len() != l {
  690. di, si := dst, src
  691. // find real pos of src and dst
  692. for i := 0; i < l; i++ {
  693. if s.At(i).Exists() {
  694. di--
  695. si--
  696. }
  697. if di == -1 {
  698. dst = i
  699. di--
  700. }
  701. if si == -1 {
  702. src = i
  703. si--
  704. }
  705. if di == -2 && si == -2 {
  706. break
  707. }
  708. }
  709. }
  710. s.MoveOne(src, dst)
  711. return nil
  712. }
  713. // SetAny wraps val with V_ANY node, and Add() the node.
  714. func (self *Node) AddAny(val interface{}) error {
  715. return self.Add(NewAny(val))
  716. }
  717. // GetByPath load given path on demands,
  718. // which only ensure nodes before this path got parsed.
  719. //
  720. // Note, the api expects the json is well-formed at least,
  721. // otherwise it may return unexpected result.
  722. func (self *Node) GetByPath(path ...interface{}) *Node {
  723. if !self.Valid() {
  724. return self
  725. }
  726. var s = self
  727. for _, p := range path {
  728. switch p := p.(type) {
  729. case int:
  730. s = s.Index(p)
  731. if !s.Valid() {
  732. return s
  733. }
  734. case string:
  735. s = s.Get(p)
  736. if !s.Valid() {
  737. return s
  738. }
  739. default:
  740. panic("path must be either int or string")
  741. }
  742. }
  743. return s
  744. }
  745. // Get loads given key of an object node on demands
  746. func (self *Node) Get(key string) *Node {
  747. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  748. return unwrapError(err)
  749. }
  750. n, _ := self.skipKey(key)
  751. return n
  752. }
  753. // Index indexies node at given idx,
  754. // node type CAN be either V_OBJECT or V_ARRAY
  755. func (self *Node) Index(idx int) *Node {
  756. if err := self.checkRaw(); err != nil {
  757. return unwrapError(err)
  758. }
  759. it := self.itype()
  760. if it == types.V_ARRAY {
  761. return self.skipIndex(idx)
  762. }else if it == types.V_OBJECT {
  763. pr := self.skipIndexPair(idx)
  764. if pr == nil {
  765. return newError(_ERR_NOT_FOUND, "value not exists")
  766. }
  767. return &pr.Value
  768. } else {
  769. return newError(_ERR_UNSUPPORT_TYPE, fmt.Sprintf("unsupported type: %v", self.itype()))
  770. }
  771. }
  772. // IndexPair indexies pair at given idx,
  773. // node type MUST be either V_OBJECT
  774. func (self *Node) IndexPair(idx int) *Pair {
  775. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  776. return nil
  777. }
  778. return self.skipIndexPair(idx)
  779. }
  780. func (self *Node) indexOrGet(idx int, key string) (*Node, int) {
  781. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  782. return unwrapError(err), idx
  783. }
  784. pr := self.skipIndexPair(idx)
  785. if pr != nil && pr.Key == key {
  786. return &pr.Value, idx
  787. }
  788. return self.skipKey(key)
  789. }
  790. // IndexOrGet firstly use idx to index a value and check if its key matches
  791. // If not, then use the key to search value
  792. func (self *Node) IndexOrGet(idx int, key string) *Node {
  793. node, _ := self.indexOrGet(idx, key)
  794. return node
  795. }
  796. // IndexOrGetWithIdx attempts to retrieve a node by index and key, returning the node and its correct index.
  797. // If the key does not match at the given index, it searches by key and returns the node with its updated index.
  798. func (self *Node) IndexOrGetWithIdx(idx int, key string) (*Node, int) {
  799. return self.indexOrGet(idx, key)
  800. }
  801. /** Generic Value Converters **/
  802. // Map loads all keys of an object node
  803. func (self *Node) Map() (map[string]interface{}, error) {
  804. if self.isAny() {
  805. any := self.packAny()
  806. if v, ok := any.(map[string]interface{}); ok {
  807. return v, nil
  808. } else {
  809. return nil, ErrUnsupportType
  810. }
  811. }
  812. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  813. return nil, err
  814. }
  815. if err := self.loadAllKey(); err != nil {
  816. return nil, err
  817. }
  818. return self.toGenericObject()
  819. }
  820. // MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number
  821. func (self *Node) MapUseNumber() (map[string]interface{}, error) {
  822. if self.isAny() {
  823. any := self.packAny()
  824. if v, ok := any.(map[string]interface{}); ok {
  825. return v, nil
  826. } else {
  827. return nil, ErrUnsupportType
  828. }
  829. }
  830. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  831. return nil, err
  832. }
  833. if err := self.loadAllKey(); err != nil {
  834. return nil, err
  835. }
  836. return self.toGenericObjectUseNumber()
  837. }
  838. // MapUseNode scans both parsed and non-parsed chidren nodes,
  839. // and map them by their keys
  840. func (self *Node) MapUseNode() (map[string]Node, error) {
  841. if self.isAny() {
  842. any := self.packAny()
  843. if v, ok := any.(map[string]Node); ok {
  844. return v, nil
  845. } else {
  846. return nil, ErrUnsupportType
  847. }
  848. }
  849. if err := self.should(types.V_OBJECT, "an object"); err != nil {
  850. return nil, err
  851. }
  852. if err := self.skipAllKey(); err != nil {
  853. return nil, err
  854. }
  855. return self.toGenericObjectUseNode()
  856. }
  857. // MapUnsafe exports the underlying pointer to its children map
  858. // WARN: don't use it unless you know what you are doing
  859. //
  860. // Deprecated: this API now returns copied nodes instead of directly reference,
  861. // func (self *Node) UnsafeMap() ([]Pair, error) {
  862. // if err := self.should(types.V_OBJECT, "an object"); err != nil {
  863. // return nil, err
  864. // }
  865. // if err := self.skipAllKey(); err != nil {
  866. // return nil, err
  867. // }
  868. // return self.toGenericObjectUsePair()
  869. // }
  870. //go:nocheckptr
  871. func (self *Node) unsafeMap() (*linkedPairs, error) {
  872. if err := self.skipAllKey(); err != nil {
  873. return nil, err
  874. }
  875. if self.p == nil {
  876. *self = newObject(new(linkedPairs))
  877. }
  878. return (*linkedPairs)(self.p), nil
  879. }
  880. // SortKeys sorts children of a V_OBJECT node in ascending key-order.
  881. // If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found.
  882. func (self *Node) SortKeys(recurse bool) error {
  883. // check raw node first
  884. if err := self.checkRaw(); err != nil {
  885. return err
  886. }
  887. if self.itype() == types.V_OBJECT {
  888. return self.sortKeys(recurse)
  889. } else if self.itype() == types.V_ARRAY {
  890. var err error
  891. err2 := self.ForEach(func(path Sequence, node *Node) bool {
  892. it := node.itype()
  893. if it == types.V_ARRAY || it == types.V_OBJECT {
  894. err = node.SortKeys(recurse)
  895. if err != nil {
  896. return false
  897. }
  898. }
  899. return true
  900. })
  901. if err != nil {
  902. return err
  903. }
  904. return err2
  905. } else {
  906. return nil
  907. }
  908. }
  909. func (self *Node) sortKeys(recurse bool) (err error) {
  910. // check raw node first
  911. if err := self.checkRaw(); err != nil {
  912. return err
  913. }
  914. ps, err := self.unsafeMap()
  915. if err != nil {
  916. return err
  917. }
  918. ps.Sort()
  919. if recurse {
  920. var sc Scanner
  921. sc = func(path Sequence, node *Node) bool {
  922. if node.itype() == types.V_OBJECT {
  923. if err := node.sortKeys(recurse); err != nil {
  924. return false
  925. }
  926. }
  927. if node.itype() == types.V_ARRAY {
  928. if err := node.ForEach(sc); err != nil {
  929. return false
  930. }
  931. }
  932. return true
  933. }
  934. if err := self.ForEach(sc); err != nil {
  935. return err
  936. }
  937. }
  938. return nil
  939. }
  940. // Array loads all indexes of an array node
  941. func (self *Node) Array() ([]interface{}, error) {
  942. if self.isAny() {
  943. any := self.packAny()
  944. if v, ok := any.([]interface{}); ok {
  945. return v, nil
  946. } else {
  947. return nil, ErrUnsupportType
  948. }
  949. }
  950. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  951. return nil, err
  952. }
  953. if err := self.loadAllIndex(); err != nil {
  954. return nil, err
  955. }
  956. return self.toGenericArray()
  957. }
  958. // ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number
  959. func (self *Node) ArrayUseNumber() ([]interface{}, error) {
  960. if self.isAny() {
  961. any := self.packAny()
  962. if v, ok := any.([]interface{}); ok {
  963. return v, nil
  964. } else {
  965. return nil, ErrUnsupportType
  966. }
  967. }
  968. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  969. return nil, err
  970. }
  971. if err := self.loadAllIndex(); err != nil {
  972. return nil, err
  973. }
  974. return self.toGenericArrayUseNumber()
  975. }
  976. // ArrayUseNode copys both parsed and non-parsed chidren nodes,
  977. // and indexes them by original order
  978. func (self *Node) ArrayUseNode() ([]Node, error) {
  979. if self.isAny() {
  980. any := self.packAny()
  981. if v, ok := any.([]Node); ok {
  982. return v, nil
  983. } else {
  984. return nil, ErrUnsupportType
  985. }
  986. }
  987. if err := self.should(types.V_ARRAY, "an array"); err != nil {
  988. return nil, err
  989. }
  990. if err := self.skipAllIndex(); err != nil {
  991. return nil, err
  992. }
  993. return self.toGenericArrayUseNode()
  994. }
  995. // ArrayUnsafe exports the underlying pointer to its children array
  996. // WARN: don't use it unless you know what you are doing
  997. //
  998. // Deprecated: this API now returns copied nodes instead of directly reference,
  999. // which has no difference with ArrayUseNode
  1000. // func (self *Node) UnsafeArray() ([]Node, error) {
  1001. // if err := self.should(types.V_ARRAY, "an array"); err != nil {
  1002. // return nil, err
  1003. // }
  1004. // if err := self.skipAllIndex(); err != nil {
  1005. // return nil, err
  1006. // }
  1007. // return self.toGenericArrayUseNode()
  1008. // }
  1009. func (self *Node) unsafeArray() (*linkedNodes, error) {
  1010. if err := self.skipAllIndex(); err != nil {
  1011. return nil, err
  1012. }
  1013. if self.p == nil {
  1014. *self = newArray(new(linkedNodes))
  1015. }
  1016. return (*linkedNodes)(self.p), nil
  1017. }
  1018. // Interface loads all children under all pathes from this node,
  1019. // and converts itself as generic type.
  1020. // WARN: all numberic nodes are casted to float64
  1021. func (self *Node) Interface() (interface{}, error) {
  1022. if err := self.checkRaw(); err != nil {
  1023. return nil, err
  1024. }
  1025. switch self.t {
  1026. case V_ERROR : return nil, self.Check()
  1027. case types.V_NULL : return nil, nil
  1028. case types.V_TRUE : return true, nil
  1029. case types.V_FALSE : return false, nil
  1030. case types.V_ARRAY : return self.toGenericArray()
  1031. case types.V_OBJECT : return self.toGenericObject()
  1032. case types.V_STRING : return self.toString(), nil
  1033. case _V_NUMBER :
  1034. v, err := self.toFloat64()
  1035. if err != nil {
  1036. return nil, err
  1037. }
  1038. return v, nil
  1039. case _V_ARRAY_LAZY :
  1040. if err := self.loadAllIndex(); err != nil {
  1041. return nil, err
  1042. }
  1043. return self.toGenericArray()
  1044. case _V_OBJECT_LAZY :
  1045. if err := self.loadAllKey(); err != nil {
  1046. return nil, err
  1047. }
  1048. return self.toGenericObject()
  1049. case _V_ANY:
  1050. switch v := self.packAny().(type) {
  1051. case Node : return v.Interface()
  1052. case *Node: return v.Interface()
  1053. default : return v, nil
  1054. }
  1055. default : return nil, ErrUnsupportType
  1056. }
  1057. }
  1058. func (self *Node) packAny() interface{} {
  1059. return *(*interface{})(self.p)
  1060. }
  1061. // InterfaceUseNumber works same with Interface()
  1062. // except numberic nodes are casted to json.Number
  1063. func (self *Node) InterfaceUseNumber() (interface{}, error) {
  1064. if err := self.checkRaw(); err != nil {
  1065. return nil, err
  1066. }
  1067. switch self.t {
  1068. case V_ERROR : return nil, self.Check()
  1069. case types.V_NULL : return nil, nil
  1070. case types.V_TRUE : return true, nil
  1071. case types.V_FALSE : return false, nil
  1072. case types.V_ARRAY : return self.toGenericArrayUseNumber()
  1073. case types.V_OBJECT : return self.toGenericObjectUseNumber()
  1074. case types.V_STRING : return self.toString(), nil
  1075. case _V_NUMBER : return self.toNumber(), nil
  1076. case _V_ARRAY_LAZY :
  1077. if err := self.loadAllIndex(); err != nil {
  1078. return nil, err
  1079. }
  1080. return self.toGenericArrayUseNumber()
  1081. case _V_OBJECT_LAZY :
  1082. if err := self.loadAllKey(); err != nil {
  1083. return nil, err
  1084. }
  1085. return self.toGenericObjectUseNumber()
  1086. case _V_ANY : return self.packAny(), nil
  1087. default : return nil, ErrUnsupportType
  1088. }
  1089. }
  1090. // InterfaceUseNode clone itself as a new node,
  1091. // or its children as map[string]Node (or []Node)
  1092. func (self *Node) InterfaceUseNode() (interface{}, error) {
  1093. if err := self.checkRaw(); err != nil {
  1094. return nil, err
  1095. }
  1096. switch self.t {
  1097. case types.V_ARRAY : return self.toGenericArrayUseNode()
  1098. case types.V_OBJECT : return self.toGenericObjectUseNode()
  1099. case _V_ARRAY_LAZY :
  1100. if err := self.skipAllIndex(); err != nil {
  1101. return nil, err
  1102. }
  1103. return self.toGenericArrayUseNode()
  1104. case _V_OBJECT_LAZY :
  1105. if err := self.skipAllKey(); err != nil {
  1106. return nil, err
  1107. }
  1108. return self.toGenericObjectUseNode()
  1109. default : return *self, self.Check()
  1110. }
  1111. }
  1112. // LoadAll loads all the node's children and children's children as parsed.
  1113. // After calling it, the node can be safely used on concurrency
  1114. func (self *Node) LoadAll() error {
  1115. if self.IsRaw() {
  1116. self.parseRaw(true)
  1117. return self.Check()
  1118. }
  1119. switch self.itype() {
  1120. case types.V_ARRAY:
  1121. e := self.len()
  1122. if err := self.loadAllIndex(); err != nil {
  1123. return err
  1124. }
  1125. for i := 0; i < e; i++ {
  1126. n := self.nodeAt(i)
  1127. if n.IsRaw() {
  1128. n.parseRaw(true)
  1129. }
  1130. if err := n.Check(); err != nil {
  1131. return err
  1132. }
  1133. }
  1134. return nil
  1135. case types.V_OBJECT:
  1136. e := self.len()
  1137. if err := self.loadAllKey(); err != nil {
  1138. return err
  1139. }
  1140. for i := 0; i < e; i++ {
  1141. n := self.pairAt(i)
  1142. if n.Value.IsRaw() {
  1143. n.Value.parseRaw(true)
  1144. }
  1145. if err := n.Value.Check(); err != nil {
  1146. return err
  1147. }
  1148. }
  1149. return nil
  1150. default:
  1151. return self.Check()
  1152. }
  1153. }
  1154. // Load loads the node's children as parsed.
  1155. // After calling it, only the node itself can be used on concurrency (not include its children)
  1156. func (self *Node) Load() error {
  1157. if err := self.checkRaw(); err != nil {
  1158. return err
  1159. }
  1160. switch self.t {
  1161. case _V_ARRAY_LAZY:
  1162. return self.skipAllIndex()
  1163. case _V_OBJECT_LAZY:
  1164. return self.skipAllKey()
  1165. default:
  1166. return self.Check()
  1167. }
  1168. }
  1169. /**---------------------------------- Internal Helper Methods ----------------------------------**/
  1170. func (self *Node) should(t types.ValueType, s string) error {
  1171. if err := self.checkRaw(); err != nil {
  1172. return err
  1173. }
  1174. if self.itype() != t {
  1175. return ErrUnsupportType
  1176. }
  1177. return nil
  1178. }
  1179. func (self *Node) nodeAt(i int) *Node {
  1180. var p *linkedNodes
  1181. if self.isLazy() {
  1182. _, stack := self.getParserAndArrayStack()
  1183. p = &stack.v
  1184. } else {
  1185. p = (*linkedNodes)(self.p)
  1186. if l := p.Len(); l != self.len() {
  1187. // some nodes got unset, iterate to skip them
  1188. for j:=0; j<l; j++ {
  1189. v := p.At(j)
  1190. if v.Exists() {
  1191. i--
  1192. }
  1193. if i < 0 {
  1194. return v
  1195. }
  1196. }
  1197. return nil
  1198. }
  1199. }
  1200. return p.At(i)
  1201. }
  1202. func (self *Node) pairAt(i int) *Pair {
  1203. var p *linkedPairs
  1204. if self.isLazy() {
  1205. _, stack := self.getParserAndObjectStack()
  1206. p = &stack.v
  1207. } else {
  1208. p = (*linkedPairs)(self.p)
  1209. if l := p.Len(); l != self.len() {
  1210. // some nodes got unset, iterate to skip them
  1211. for j:=0; j<l; j++ {
  1212. v := p.At(j)
  1213. if v != nil && v.Value.Exists() {
  1214. i--
  1215. }
  1216. if i < 0 {
  1217. return v
  1218. }
  1219. }
  1220. return nil
  1221. }
  1222. }
  1223. return p.At(i)
  1224. }
  1225. func (self *Node) skipAllIndex() error {
  1226. if !self.isLazy() {
  1227. return nil
  1228. }
  1229. var err types.ParsingError
  1230. parser, stack := self.getParserAndArrayStack()
  1231. parser.skipValue = true
  1232. parser.noLazy = true
  1233. *self, err = parser.decodeArray(&stack.v)
  1234. if err != 0 {
  1235. return parser.ExportError(err)
  1236. }
  1237. return nil
  1238. }
  1239. func (self *Node) skipAllKey() error {
  1240. if !self.isLazy() {
  1241. return nil
  1242. }
  1243. var err types.ParsingError
  1244. parser, stack := self.getParserAndObjectStack()
  1245. parser.skipValue = true
  1246. parser.noLazy = true
  1247. *self, err = parser.decodeObject(&stack.v)
  1248. if err != 0 {
  1249. return parser.ExportError(err)
  1250. }
  1251. return nil
  1252. }
  1253. func (self *Node) skipKey(key string) (*Node, int) {
  1254. nb := self.len()
  1255. lazy := self.isLazy()
  1256. if nb > 0 {
  1257. /* linear search */
  1258. var p *Pair
  1259. var i int
  1260. if lazy {
  1261. s := (*parseObjectStack)(self.p)
  1262. p, i = s.v.Get(key)
  1263. } else {
  1264. p, i = (*linkedPairs)(self.p).Get(key)
  1265. }
  1266. if p != nil {
  1267. return &p.Value, i
  1268. }
  1269. }
  1270. /* not found */
  1271. if !lazy {
  1272. return nil, -1
  1273. }
  1274. // lazy load
  1275. for last, i := self.skipNextPair(), nb; last != nil; last, i = self.skipNextPair(), i+1 {
  1276. if last.Value.Check() != nil {
  1277. return &last.Value, -1
  1278. }
  1279. if last.Key == key {
  1280. return &last.Value, i
  1281. }
  1282. }
  1283. return nil, -1
  1284. }
  1285. func (self *Node) skipIndex(index int) *Node {
  1286. nb := self.len()
  1287. if nb > index {
  1288. v := self.nodeAt(index)
  1289. return v
  1290. }
  1291. if !self.isLazy() {
  1292. return nil
  1293. }
  1294. // lazy load
  1295. for last := self.skipNextNode(); last != nil; last = self.skipNextNode(){
  1296. if last.Check() != nil {
  1297. return last
  1298. }
  1299. if self.len() > index {
  1300. return last
  1301. }
  1302. }
  1303. return nil
  1304. }
  1305. func (self *Node) skipIndexPair(index int) *Pair {
  1306. nb := self.len()
  1307. if nb > index {
  1308. return self.pairAt(index)
  1309. }
  1310. if !self.isLazy() {
  1311. return nil
  1312. }
  1313. // lazy load
  1314. for last := self.skipNextPair(); last != nil; last = self.skipNextPair(){
  1315. if last.Value.Check() != nil {
  1316. return last
  1317. }
  1318. if self.len() > index {
  1319. return last
  1320. }
  1321. }
  1322. return nil
  1323. }
  1324. func (self *Node) loadAllIndex() error {
  1325. if !self.isLazy() {
  1326. return nil
  1327. }
  1328. var err types.ParsingError
  1329. parser, stack := self.getParserAndArrayStack()
  1330. parser.noLazy = true
  1331. *self, err = parser.decodeArray(&stack.v)
  1332. if err != 0 {
  1333. return parser.ExportError(err)
  1334. }
  1335. return nil
  1336. }
  1337. func (self *Node) loadAllKey() error {
  1338. if !self.isLazy() {
  1339. return nil
  1340. }
  1341. var err types.ParsingError
  1342. parser, stack := self.getParserAndObjectStack()
  1343. parser.noLazy = true
  1344. *self, err = parser.decodeObject(&stack.v)
  1345. if err != 0 {
  1346. return parser.ExportError(err)
  1347. }
  1348. return nil
  1349. }
  1350. func (self *Node) removeNode(i int) {
  1351. node := self.nodeAt(i)
  1352. if node == nil {
  1353. return
  1354. }
  1355. *node = Node{}
  1356. // NOTICE: not be consistent with linkedNode.Len()
  1357. self.l--
  1358. }
  1359. func (self *Node) removePair(i int) {
  1360. last := self.pairAt(i)
  1361. if last == nil {
  1362. return
  1363. }
  1364. *last = Pair{}
  1365. // NOTICE: should be consistent with linkedPair.Len()
  1366. self.l--
  1367. }
  1368. func (self *Node) removePairAt(i int) {
  1369. p := (*linkedPairs)(self.p).At(i)
  1370. if p == nil {
  1371. return
  1372. }
  1373. *p = Pair{}
  1374. // NOTICE: should be consistent with linkedPair.Len()
  1375. self.l--
  1376. }
  1377. func (self *Node) toGenericArray() ([]interface{}, error) {
  1378. nb := self.len()
  1379. if nb == 0 {
  1380. return []interface{}{}, nil
  1381. }
  1382. ret := make([]interface{}, 0, nb)
  1383. /* convert each item */
  1384. it := self.values()
  1385. for v := it.next(); v != nil; v = it.next() {
  1386. vv, err := v.Interface()
  1387. if err != nil {
  1388. return nil, err
  1389. }
  1390. ret = append(ret, vv)
  1391. }
  1392. /* all done */
  1393. return ret, nil
  1394. }
  1395. func (self *Node) toGenericArrayUseNumber() ([]interface{}, error) {
  1396. nb := self.len()
  1397. if nb == 0 {
  1398. return []interface{}{}, nil
  1399. }
  1400. ret := make([]interface{}, 0, nb)
  1401. /* convert each item */
  1402. it := self.values()
  1403. for v := it.next(); v != nil; v = it.next() {
  1404. vv, err := v.InterfaceUseNumber()
  1405. if err != nil {
  1406. return nil, err
  1407. }
  1408. ret = append(ret, vv)
  1409. }
  1410. /* all done */
  1411. return ret, nil
  1412. }
  1413. func (self *Node) toGenericArrayUseNode() ([]Node, error) {
  1414. var nb = self.len()
  1415. if nb == 0 {
  1416. return []Node{}, nil
  1417. }
  1418. var s = (*linkedNodes)(self.p)
  1419. var out = make([]Node, nb)
  1420. s.ToSlice(out)
  1421. return out, nil
  1422. }
  1423. func (self *Node) toGenericObject() (map[string]interface{}, error) {
  1424. nb := self.len()
  1425. if nb == 0 {
  1426. return map[string]interface{}{}, nil
  1427. }
  1428. ret := make(map[string]interface{}, nb)
  1429. /* convert each item */
  1430. it := self.properties()
  1431. for v := it.next(); v != nil; v = it.next() {
  1432. vv, err := v.Value.Interface()
  1433. if err != nil {
  1434. return nil, err
  1435. }
  1436. ret[v.Key] = vv
  1437. }
  1438. /* all done */
  1439. return ret, nil
  1440. }
  1441. func (self *Node) toGenericObjectUseNumber() (map[string]interface{}, error) {
  1442. nb := self.len()
  1443. if nb == 0 {
  1444. return map[string]interface{}{}, nil
  1445. }
  1446. ret := make(map[string]interface{}, nb)
  1447. /* convert each item */
  1448. it := self.properties()
  1449. for v := it.next(); v != nil; v = it.next() {
  1450. vv, err := v.Value.InterfaceUseNumber()
  1451. if err != nil {
  1452. return nil, err
  1453. }
  1454. ret[v.Key] = vv
  1455. }
  1456. /* all done */
  1457. return ret, nil
  1458. }
  1459. func (self *Node) toGenericObjectUseNode() (map[string]Node, error) {
  1460. var nb = self.len()
  1461. if nb == 0 {
  1462. return map[string]Node{}, nil
  1463. }
  1464. var s = (*linkedPairs)(self.p)
  1465. var out = make(map[string]Node, nb)
  1466. s.ToMap(out)
  1467. /* all done */
  1468. return out, nil
  1469. }
  1470. /**------------------------------------ Factory Methods ------------------------------------**/
  1471. var (
  1472. nullNode = Node{t: types.V_NULL}
  1473. trueNode = Node{t: types.V_TRUE}
  1474. falseNode = Node{t: types.V_FALSE}
  1475. )
  1476. // NewRaw creates a node of raw json.
  1477. // If the input json is invalid, NewRaw returns a error Node.
  1478. func NewRaw(json string) Node {
  1479. parser := NewParserObj(json)
  1480. start, err := parser.skip()
  1481. if err != 0 {
  1482. return *newError(err, err.Message())
  1483. }
  1484. it := switchRawType(parser.s[start])
  1485. if it == _V_NONE {
  1486. return Node{}
  1487. }
  1488. return newRawNode(parser.s[start:parser.p], it)
  1489. }
  1490. // NewAny creates a node of type V_ANY if any's type isn't Node or *Node,
  1491. // which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`.
  1492. func NewAny(any interface{}) Node {
  1493. switch n := any.(type) {
  1494. case Node:
  1495. return n
  1496. case *Node:
  1497. return *n
  1498. default:
  1499. return Node{
  1500. t: _V_ANY,
  1501. p: unsafe.Pointer(&any),
  1502. }
  1503. }
  1504. }
  1505. // NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING.
  1506. func NewBytes(src []byte) Node {
  1507. if len(src) == 0 {
  1508. panic("empty src bytes")
  1509. }
  1510. out := encodeBase64(src)
  1511. return NewString(out)
  1512. }
  1513. // NewNull creates a node of type V_NULL
  1514. func NewNull() Node {
  1515. return Node{
  1516. p: nil,
  1517. t: types.V_NULL,
  1518. }
  1519. }
  1520. // NewBool creates a node of type bool:
  1521. // If v is true, returns V_TRUE node
  1522. // If v is false, returns V_FALSE node
  1523. func NewBool(v bool) Node {
  1524. var t = types.V_FALSE
  1525. if v {
  1526. t = types.V_TRUE
  1527. }
  1528. return Node{
  1529. p: nil,
  1530. t: t,
  1531. }
  1532. }
  1533. // NewNumber creates a json.Number node
  1534. // v must be a decimal string complying with RFC8259
  1535. func NewNumber(v string) Node {
  1536. return Node{
  1537. l: uint(len(v)),
  1538. p: rt.StrPtr(v),
  1539. t: _V_NUMBER,
  1540. }
  1541. }
  1542. func (node Node) toNumber() json.Number {
  1543. return json.Number(rt.StrFrom(node.p, int64(node.l)))
  1544. }
  1545. func (self Node) toString() string {
  1546. return rt.StrFrom(self.p, int64(self.l))
  1547. }
  1548. func (node Node) toFloat64() (float64, error) {
  1549. ret, err := node.toNumber().Float64()
  1550. if err != nil {
  1551. return 0, err
  1552. }
  1553. return ret, nil
  1554. }
  1555. func (node Node) toInt64() (int64, error) {
  1556. ret,err := node.toNumber().Int64()
  1557. if err != nil {
  1558. return 0, err
  1559. }
  1560. return ret, nil
  1561. }
  1562. func newBytes(v []byte) Node {
  1563. return Node{
  1564. t: types.V_STRING,
  1565. p: mem2ptr(v),
  1566. l: uint(len(v)),
  1567. }
  1568. }
  1569. // NewString creates a node of type V_STRING.
  1570. // v is considered to be a valid UTF-8 string,
  1571. // which means it won't be validated and unescaped.
  1572. // when the node is encoded to json, v will be escaped.
  1573. func NewString(v string) Node {
  1574. return Node{
  1575. t: types.V_STRING,
  1576. p: rt.StrPtr(v),
  1577. l: uint(len(v)),
  1578. }
  1579. }
  1580. // NewArray creates a node of type V_ARRAY,
  1581. // using v as its underlying children
  1582. func NewArray(v []Node) Node {
  1583. s := new(linkedNodes)
  1584. s.FromSlice(v)
  1585. return newArray(s)
  1586. }
  1587. func newArray(v *linkedNodes) Node {
  1588. return Node{
  1589. t: types.V_ARRAY,
  1590. l: uint(v.Len()),
  1591. p: unsafe.Pointer(v),
  1592. }
  1593. }
  1594. func (self *Node) setArray(v *linkedNodes) {
  1595. self.t = types.V_ARRAY
  1596. self.l = uint(v.Len())
  1597. self.p = unsafe.Pointer(v)
  1598. }
  1599. // NewObject creates a node of type V_OBJECT,
  1600. // using v as its underlying children
  1601. func NewObject(v []Pair) Node {
  1602. s := new(linkedPairs)
  1603. s.FromSlice(v)
  1604. return newObject(s)
  1605. }
  1606. func newObject(v *linkedPairs) Node {
  1607. return Node{
  1608. t: types.V_OBJECT,
  1609. l: uint(v.Len()),
  1610. p: unsafe.Pointer(v),
  1611. }
  1612. }
  1613. func (self *Node) setObject(v *linkedPairs) {
  1614. self.t = types.V_OBJECT
  1615. self.l = uint(v.Len())
  1616. self.p = unsafe.Pointer(v)
  1617. }
  1618. func newRawNode(str string, typ types.ValueType) Node {
  1619. return Node{
  1620. t: _V_RAW | typ,
  1621. p: rt.StrPtr(str),
  1622. l: uint(len(str)),
  1623. }
  1624. }
  1625. func (self *Node) parseRaw(full bool) {
  1626. raw := self.toString()
  1627. parser := NewParserObj(raw)
  1628. if full {
  1629. parser.noLazy = true
  1630. parser.skipValue = false
  1631. }
  1632. var e types.ParsingError
  1633. *self, e = parser.Parse()
  1634. if e != 0 {
  1635. *self = *newSyntaxError(parser.syntaxError(e))
  1636. }
  1637. }
  1638. var typeJumpTable = [256]types.ValueType{
  1639. '"' : types.V_STRING,
  1640. '-' : _V_NUMBER,
  1641. '0' : _V_NUMBER,
  1642. '1' : _V_NUMBER,
  1643. '2' : _V_NUMBER,
  1644. '3' : _V_NUMBER,
  1645. '4' : _V_NUMBER,
  1646. '5' : _V_NUMBER,
  1647. '6' : _V_NUMBER,
  1648. '7' : _V_NUMBER,
  1649. '8' : _V_NUMBER,
  1650. '9' : _V_NUMBER,
  1651. '[' : types.V_ARRAY,
  1652. 'f' : types.V_FALSE,
  1653. 'n' : types.V_NULL,
  1654. 't' : types.V_TRUE,
  1655. '{' : types.V_OBJECT,
  1656. }
  1657. func switchRawType(c byte) types.ValueType {
  1658. return typeJumpTable[c]
  1659. }