Hi Thanks Bill. And sorry for my delayed reply. BTW, I am cross-posting this to the J programming mailing list, for the people who are interested in the follow-up.
I've ran your version of json against the standard package version and the standard pure python json module. Your version is faster but takes larger memory, but the result is not exactly the same(more on this at the end). The standard version: bm=. 1!:1 <'Bookmarks' ts=: 6!:2,7!:2@] ts 'dec_json bm' 66.3499 5.36879e8 The new version you provided: ts 'dec_json bm' 34.6758 1.36445e9 The standard pure python version: 0.4986 75272192 In J, the standard json and the new version you provided resulted in different output. newresult -: oldresult 0 Yet, the enc_json'd result seems to be the same. newresult -:&enc_json standardresult 1 However, the resulted J representation is different. I just sampled one difference -- I am not sure if it could help. 3!:3 (((<1 0) {>@(1 {>@((<1 0){ >@((<1 1) { >@((<1 1){])))))) standardresult e300000000000000 2000000000000000 0100000000000000 0000000000000000 2800000000000000 e300000000000000 2000000000000000 0100000000000000 0100000000000000 0100000000000000 3000000000000000 e300000000000000 2000000000000000 0c00000000000000 0200000000000000 0200000000000000 0600000000000000 9000000000000000 c800000000000000 f800000000000000 2801000000000000 7001000000000000 a001000000000000 d001000000000000 1002000000000000 4002000000000000 9002000000000000 c002000000000000 f002000000000000 e300000000000000 0200000000000000 0a00000000000000 0100000000000000 0a00000000000000 646174655f616464 6564000000000000 e300000000000000 0200000000000000 0200000000000000 0100000000000000 0200000000000000 6964000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 6e616d6500000000 e300000000000000 0200000000000000 1800000000000000 0100000000000000 1800000000000000 73796e635f747261 6e73616374696f6e 5f76657273696f6e 0000000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 7479706500000000 e300000000000000 0200000000000000 0300000000000000 0100000000000000 0300000000000000 75726c0000000000 e300000000000000 0200000000000000 1100000000000000 0100000000000000 1100000000000000 3133303031353737 3430313837303032 3100000000000000 e300000000000000 0200000000000000 0500000000000000 0100000000000000 0500000000000000 3330363133000000 e300000000000000 0200000000000000 2200000000000000 0100000000000000 2200000000000000 ec9584eab8b02045 5350202d20416e64 726f696420eba788 ecbc93ec9d9820ec 95b1000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 3230343300000000 e300000000000000 0200000000000000 0300000000000000 0100000000000000 0300000000000000 75726c0000000000 e300000000000000 0200000000000000 7e00000000000000 0100000000000000 7e00000000000000 68747470733a2f2f 6d61726b65742e61 6e64726f69642e63 6f6d2f6465746169 6c733f69643d636f 6d2e686577697474 736f66742e626162 7926666561747572 653d746f702d7061 6964233f743d5732 3531624777734d53 77794c4449774e69 7769593239744c6d 686c64326c306448 4e765a6e5175596d 466965534a640000 3!:3 (((<1 0) {>@(1 {>@((<1 0){ >@((<1 1) { >@((<1 1){])))))) newresult e300000000000000 2000000000000000 0100000000000000 0000000000000000 2800000000000000 e300000000000000 2000000000000000 0100000000000000 0000000000000000 2800000000000000 e300000000000000 2000000000000000 0c00000000000000 0200000000000000 0200000000000000 0600000000000000 9000000000000000 c800000000000000 f800000000000000 2801000000000000 7001000000000000 a001000000000000 d001000000000000 1002000000000000 4002000000000000 9002000000000000 c002000000000000 f002000000000000 e300000000000000 0200000000000000 0a00000000000000 0100000000000000 0a00000000000000 646174655f616464 6564000000000000 e300000000000000 0200000000000000 0200000000000000 0100000000000000 0200000000000000 6964000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 6e616d6500000000 e300000000000000 0200000000000000 1800000000000000 0100000000000000 1800000000000000 73796e635f747261 6e73616374696f6e 5f76657273696f6e 0000000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 7479706500000000 e300000000000000 0200000000000000 0300000000000000 0100000000000000 0300000000000000 75726c0000000000 e300000000000000 0200000000000000 1100000000000000 0100000000000000 1100000000000000 3133303031353737 3430313837303032 3100000000000000 e300000000000000 0200000000000000 0500000000000000 0100000000000000 0500000000000000 3330363133000000 e300000000000000 0200000000000000 2200000000000000 0100000000000000 2200000000000000 ec9584eab8b02045 5350202d20416e64 726f696420eba788 ecbc93ec9d9820ec 95b1000000000000 e300000000000000 0200000000000000 0400000000000000 0100000000000000 0400000000000000 3230343300000000 e300000000000000 0200000000000000 0300000000000000 0100000000000000 0300000000000000 75726c0000000000 e300000000000000 0200000000000000 7e00000000000000 0100000000000000 7e00000000000000 68747470733a2f2f 6d61726b65742e61 6e64726f69642e63 6f6d2f6465746169 6c733f69643d636f 6d2e686577697474 736f66742e626162 7926666561747572 653d746f702d7061 6964233f743d5732 3531624777734d53 77794c4449774e69 7769593239744c6d 686c64326c306448 4e765a6e5175596d 466965534a640000 On Tue, Mar 4, 2014 at 12:40 PM, bill lam <bbill....@gmail.com> wrote: > June, > > I changed json decoder to avoid intermediate box contenation, the > trade-off might be a much larger space requirement. Please test > its performance, the space requirement, and will the result be > correct. > > Thanks. > > -- > regards, > ==================================================== > GPG key 1024D/4434BAB3 2008-08-24 > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3 >
coclass 'json' enc_json=: 3 : 0 select. t=. 3!:0 y case. 2;131072 do. if. y-:'json_true' do. 'true' elseif. y-:'json_false' do. 'false' elseif. y-:'json_null' do. 'null' elseif. do. '"', '"',~ jsonesc utf8^:(131072=t) ,y end. case. 1;4;8 do. ":!.17 {.,y case. 32 do. if. 2>$$y do. if. 0=#y do. '[]' else. s=. '[' for_v. y do. s=. s , ',',~ enc_json >v end. ']',~ }:s end. elseif. 2=$$y do. assert. 0 2 e.~ {.$y if. 0=#y do. '{}' else. s=. '{' for_i. i.{:$y do. s=. s , ':',~ enc_json (<0,i){::y s=. s , ',',~ enc_json (<1,i){::y end. '}',~ }:s end. elseif. do. 13!:8[3 end. case. do. 13!:8[3 end. ) JSONESC0=: LF, CR, TAB, FF, (8{a.), '\/"' JSONESC1=: 'nrtfb\/"' JSONASC=: JSONESC0, 32}.127{.a. jsonesc=: 3 : 0 txt=. y msk=. txt e. JSONESC0 if. 1 e. msk do. ndx=. , ((I. msk) + i. +/ msk) +/ 0 1 new=. , '\',.JSONESC1 {~ JSONESC0 i. msk#txt txt=. new ndx } (1 + msk) # txt end. msk=. -. txt e. JSONASC if. 1 e. msk do. new=. 'u',"1 '0123456789abcdef' {~ 16 16 16 16 #: a. i. msk # txt ndx=., ((I. msk) + 5 * i. +/ msk) +/ i. 6 txt=. (, '\',("1) new) ndx } (1 + msk * 5) # txt end. txt ) classes=. 3<. '"\[],{}:' (#@[ |&>: i.) a. classes=. 0 (I.a.e.' ',CRLF,TAB)} (]+4*0=])classes words=: (0;(0 10#:10*".;._2]0 :0);classes)&;: 0.0 1.1 2.1 3.1 4.1 1.0 5.0 6.0 1.0 1.0 4.0 4.0 4.0 4.0 4.0 0.3 1.2 2.2 3.2 4.2 0.3 1.2 2.0 3.2 4.0 0.3 1.2 2.2 3.2 4.2 1.0 1.0 1.0 1.0 1.0 ) jsonValue=: 3 : 0 if. 0=#y do. <y elseif. 'true'-:y do. 'json_true' elseif. 'false'-:y do. 'json_false' elseif. 'null'-:y do. 'json_null' elseif. '"'={. y do. evalbs }.}:y elseif. '0123456789.+-' -.@e.~ {. y do. evalbs y elseif. do. {. 0". 'Ee-_' charsub y end. ) subst2=: (_2<\'\"\\\/\b\f\n\r\t')&(i.{(34 92 47 8 12 10 13 9{&.><a.),])"0 hexchars=. 'ABCDEF0123456789abcdef' dfh=: 16 #. 16 | _6 + hexchars i. ] subst6=: (8 u:[:u:@dfh 2}.]) ::]^:(6&=@#*.('\'={.)*.'uU'e.~{.@}.)&.> splitbs=: (0;(0 10#:10*".;._2]0 :0);(a.e.hexchars)+(2*a.='\')+3*a.e.'Uu')&;: 1.1 1.1 2.1 1.1 1.0 1.0 2.2 1.0 3.0 3.0 3.0 4.0 1.2 1.2 2.2 1.2 1.2 5.0 2.2 1.2 1.2 6.0 2.2 1.2 1.2 7.0 2.2 1.2 1.2 3.0 2.2 1.2 ) evalbs=: [:; [:subst2 [:subst6 splitbs^:(*@#) 'T_LBR T_RBR T_LCB T_RCB T_COM T_COL'=: ;:' [ ] { } , :' token=: 3 : 0 (_1+I=: I+1){::T ) dec_json=: 3 : 0 T=: words (LF,' ') charsub y-.CR I=: 0 > ". getVal token'' ) getVal=: 3 : 0 select. y case. T_LBR do. getList token'' case. T_LCB do. getHash token'' case. do. '(',')',~ '<',5!:5<'t'[t=. jsonValue y end. ) getList=: 3 : 0 if. T_RBR -: y do. '(<0#<'''')' return. end. r=. ,getVal y while. -. T_RBR -: y=. token'' do. assert T_COM -: y r=. r, ',', getVal token'' end. '(',')',~ '<', r ) getHash=: 3 : 0 if. T_RCB -: y do. '(<0#0 0$<'''')' return. end. r=. getPair y while. -. T_RCB -: y=. token'' do. assert T_COM -: y r=. r, ',.', getPair token'' end. '(',')',~ '<', r ) getPair=: 3 : 0 h=. getVal y assert T_COL -: token'' '(',')',~ h, ',:', getVal token'' ) gethash_json=: 4 : 0 assert. 2=$$y assert. 32=3!:0 y x=. ,&.> boxopen x assert. 1=$x if. ({.x) e. {.y do. ({:y){~({.y) i. {.x else. _1 end. ) emptyhash_json=: 3 : 0 (2=$$y) *. (0={.$y) *. 32=3!:0 y ) emptyarray_json=: 3 : 0 (2>$$y) *. (0=#y) *. 32=3!:0 y ) dec_json_z_=: dec_json_json_ enc_json_z_=: enc_json_json_ gethash_json_z_=: gethash_json_json_ emptyhash_json_z_=: emptyhash_json_json_ emptyarray_json_z_=: emptyarray_json_json_
---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm