JSONlab - compact, portable, robust JSON/binary-JSON encoder/decoder for MATLAB/Octave

JSONlab ChangeLog (key features marked by *):

JSONlab 2.9.8 (codename: Micronus Prime - beta), FangQ <q.fang (at) neu.edu>

 2024-03-28*[b39c374] [feat] add json2couch from jbids toolbox
 2024-03-28 [6da4f2b] [doc] remove the unrelated npm package.json
 2024-03-28 [36b605d] [doc] update documentation
 2024-03-27*[2e43586] [feat] merge nii/jnii/hdf5/tsv reading functions self-contained
 2024-03-27 [b482c8f] [test] pass all tests on matlab R2010b
 2024-03-27 [2008934] [doc] additional documentations on decompression functions
 2024-03-27 [0a582fb] [doc] add documentations for jsonpath, jsoncache, jdlink, and maxlinklevel
 2024-03-27 [5dba1de] [bug] .. searches deep level of struct,make jdlink work for Octave 4.2 and 5.2
 2024-03-27*[fea481e] [doc] add line-by-line comment on examples, add jsonset/jsonget
 2024-03-26*[e1d386d] [feat] support saving dictionary to json and bjdata
 2024-03-26 [dfc744b] [feat] support caching data from any URL using hash, add NO_ZMAT flag
 2024-03-24 [22d297e] [doc] fix README.rst formatting issues
 2024-03-24 [36fef2c] [bug] fix missing quotes for function names
 2024-03-24 [7e27db5] [doc] update documentation, preparing for v2.9.8 release
 2024-03-24 [1227a0b] [format] reformat
 2024-03-24 [67f30ca] [feat] support using \. or [] in JSONPath to escape dots in key names
 2024-03-24 [ee830cd] [bug] fix error_pos error when giving a non-existant input file
 2024-03-24 [d69686d] [feat] add jdlink to dynamically download and cache linked data
 2024-03-22 [772a1ef] [ci] fix octave failed test
 2024-03-22 [cff529a] [test] add jsonpath test, refine jsonpath syntax support
 2024-03-22 [22435e4] [bug] fix jsonpath handling of recursive deep scans
 2024-03-21 [c9f8a20] [bug] support deep scan in cell and struct, merge struct/containers.Map
 2024-03-21 [394394a] [bug] improve jsonpath cell with deep scan
 2024-03-20 [a599e71] [feat] add jsoncache to handle _DataLink_ download cache, rename jsonpath
 2024-02-19*[4f2edeb] [feat] support .. jsonpath operator for deep scan
 2024-01-11 [c43a758] [bug] fix missing index_esc reset, add test for automap
 2024-01-11*[ef5b472] [feat] automatically switch to map object when key length > 63
 2023-11-17 [ee24122] use sprintf to replace unescapejsonstring
 2023-11-12 [abe504f] [ci] test again on macos-12
 2023-11-12 [d2ff26a] [ci] install octave via conda on macos to avoid hanged install
 2023-11-07 [33263de] completely reformat m-files using miss_hit
 2023-11-07 [3ff781f] make octavezmat work on matlab
 2023-10-29 [ea4a4fd] make test script run on MATLAB R2010b
 2023-10-27 [ca91e07] use older matlab due to matlab-actions/run-command#43
 2023-10-27 [4bf8232] add NO_ZMAT flag, fix fread issue
 2023-10-27*[ce3c0a0] add fallback zlib/glib support on Octave via file-based zip/unzip
 2023-10-26 [7ab1b6e] fix error for expecting an ending object mark when count is given
 2023-09-08 [6dfa58e] Fix typos found by codespell
 2023-06-27 [7d7e7f7] fix typo of compression method
 2023-06-27*[c25dd0f] support blosc2 codecs in save and load data, upgrade jsave/jload
 2023-06-19 [b23181a] test root-level indentation
 2023-06-19 [5bfde65] add indentation test
 2023-06-19 [b267858] fix CI errors related to octave utf-8 handling
 2023-06-19 [1e93d07] avoid octave 6.4+ regexp non-utf8 error see discussions at octave bug thread: https://savannah.gnu.org/bugs/index.php?57107
 2023-06-15 [8f921ac] fix broken tests
 2023-06-11*[6cb5f12] allow linking binary jdata files inside json
 2023-06-10 [2d0649b] do not compress long string by default, read bjd from URI
 2023-06-10 [5135dea] saving JSON with UTF-8 encoding, fix #71
 2023-06-10*[a3c807f] add zstdencode and zstddecode via new version of zmat
 2023-06-07 [837c8b5] fix containers.Map indentiation bug with a single element
 2023-06-07 [747c99b] fix string indentation, add option EmptyArrayAsNull, fix #91
 2023-06-05*[cf57326] support blosc2 meta compressors
 2023-05-05 [d37a386] use {:} to expand varargin
 2023-04-23 [03311d2] remove README.txt, no longer used, fix #88
 2023-04-21 [49eceb0] Fix typo not found by codespell
 2023-04-21 [75b1fdc] Fix typos found by codespell
 2023-04-17 [8fea393] revert savejson change
 2023-04-17 [9554a44] Merge branch 'master' of github.com:fangq/jsonlab
 2023-04-17 [3c32aff] speed up string encoding and decoding
 2023-04-09*[8c8464f] rename jamm files to pmat - portable mat, will add jsonmmap
 2023-04-09 [aa1c2a4] drop ubuntu-18.04
 2023-04-08 [9173525] replace regexp to ismember due to octave bug 57107; test mac
 2023-04-08 [67065dc] fix matlab test
 2023-04-08 [8dcedad] use alternative test to avoid octave bug 57107
 2023-04-08*[9b6be7b] add github action based tests
 2023-02-24 [cb43ed1] add bug fix test section
 2023-02-24 [2412ebf] only simplify all-numeric or all-struct cells
 2023-02-23 [d4e77e1] add missing file extension
 2023-02-23 [408cc2e] fix loadjd and savejd file extension match, add jbids
 2023-02-22 [29bac9d] fix broken jdatahash
 2023-02-22*[69a7d01] add a portable data hash function
 2023-02-09 [0448eb1] preventing matlab 2022b converting string to unicode
 2022-11-21 [9ce91fc] handle empty struct with names, fix #85
 2022-11-20 [9687d17] accept string typed file name, close #84
 2022-08-12 [283e5f1] output data depends on nargout
 2022-08-08 [c729048] avoid conjugating complex numbers, fix #83
 2022-06-05*[fa35843] implementing JSON-Mmap spec draft 1, https://neurojson.org/jsonmmap/draft1
 2022-05-18 [8b74d30] make savejd work for saveh5 to save hdf5 files
 2022-04-19 [f1332e3] make banner image transparent background
 2022-04-19 [6cf82a6] fix issues found by dependency check
 2022-04-19 [94167bb] change neurojson urls to https
 2022-04-19 [c4c4da1] create Contents.m from matlab
 2022-04-19*[2278bb1] stop escaping / to \/ in JSON string, see https://mondotondo.com/2010/12/29/the-solidus-issue/
 2022-04-01*[fb711bb] add loadjd and savejd as the unified JSON/binary JSON file interface
 2022-03-30 [4433a21] improve datalink uri handling to consider : inside uri
 2022-03-30 [6368409] make datalink URL query more robust
 2022-03-29 [dd9e9c6] when file suffix is missing, assume JSON feed
 2022-03-29*[07c58f3] initial support for _DataLink_ of online/local file with JSONPath ref
 2022-03-29 [897b7ba] fix test for older octave
 2022-03-20 [bf03eff] force msgpack to use big-endian
 2022-03-13 [46bbfa9] support empty name key, which is valid in JSON, fix #79
 2022-03-12 [9ab040a] increase default float number digits from 10 to 16, fix #78
 2022-03-11 [485ea29] update error message on the valid root-level markers
 2022-02-23 [aa3913e] disable TFN marker in optimized header due to security risk and low benefit
 2022-02-23 [f2c3223] support SCH{[ markers in optimized container type
 2022-02-14 [540f95c] add optional preceding whitespace, explain format
 2022-02-13 [3dfa904] debugged and tested mmap, add mmapinclude and mmapexclude options
 2022-02-10*[6150ae1] handle uncompressed raw data (only base64 encoded) in jdatadecode
 2022-02-10 [88a59eb] give a warning when jdatadecode fails, but still return the raw data
 2022-02-03*[05edb7a] fast reading and writing json data record using mmap and jsonpath
 2022-02-02*[b0f0ebd] return disk-map or memory-map table in loadjson
 2022-02-01 [0888218] correct typos and add additional descriptions in README
 2022-02-01*[03133c7] fix row-major ('formatversion',1.8) ND array storage order, update demo outputs
 2022-02-01 [5998c70] revert variable name encoding to support unicode strings
 2022-01-31 [16454e7] test flexible whitespaces in 1D/2D arrays, test mixed array from string
 2022-01-31*[5c1ef15] accelerate fastarrayparser by 200%! jsonlab_speedtest cuts from 11s to 5.8s
 2022-01-30 [9b25e20] fix octave 3.8 error on travis, it does not support single
 2022-01-30 [5898f6e] add octave 5.2 to travis
 2022-01-30*[2e3344c] [bjdata:breaking] Upgrade savebj/loadbj to BJData v1-draft 2, use little-endian by default
 2022-01-30*[2e3344c] [bjdata:breaking] Fix optimized ND array element order (previously used column-major)
 2022-01-30*[2e3344c] optimize loadjson and loadbj speed
 2022-01-30*[2e3344c] add 'BuiltinJSON' option for savejson/loadjson to call jsonencode/jsondecode
 2022-01-30*[2e3344c] more robust tests on ND array when parsing JSON numerical array construct
 2021-06-23 [632531f] fix inconsistency between singlet integer and float values, close #70
 2021-06-23 [f7d8226] prevent function calls when parsing array strings using eval, fix #75
 2021-06-23 [b1ae5fa] fix #73 as a regression to #22
 2020-09-29 [d0cb3b8] Fix for loading objects.
 2020-07-26 [d0fb684] Add travis badge
 2020-07-25 [708c36c] drop octave 3.2
 2020-07-25 [436d84e] debug octave 3.2
 2020-07-25 [0ce96ec] remove windows and osx targets from travis-ci
 2020-07-25 [0d8baa4] fix ruby does not support error on windows
 2020-07-25*[faa7921] enable travis-ci for jsonlab
 2020-07-08 [321ab1a] add Debian and Ubuntu installation commands
 2020-07-08 [e686828] update author info
 2020-07-08*[ce40fdf] supports ND cell array, fix #66
 2020-07-07 [6a8ce93] fix string encoding over 399 characters, close #65
 2020-06-14 [5a58faf] fix DESCRIPTION date bug
 2020-06-14 [9d7e94c] match octave description file and upstream version number
 2020-06-14 [a5b6170] fix warning about lz4encode file name

JSONlab 2.0 (codename: Magnus Prime), FangQ <q.fang (at) neu.edu>

 2020-06-13 [81feef3] skil no-op markers, update documentation
 2020-06-13 [4904155] jload load data to struct, test if loadbj input is buffer, update error msg
 2020-06-12 [c334799] change default workspace to caller for jload and jsave
 2020-06-10 [c883546] fix keeptype single integer bug
 2020-06-09*[       ] created jdata and bjdata python modules to share data with MATLAB
 2020-06-08*[cbde607] add savebj and loadbj to dedicate to loading and saving bjdata
 2020-06-08*[e2451e1] add unit testing script, fix issues found in the testing unit
 2020-06-06 [a44015f] accelerate fast_match_bracket, drop unicode2native for speed
 2020-06-06 [eefccf3] call jsonencode/decode in jsave/jload, parse embedded jdata struct
 2020-06-05 [9434103] support Toeplitz matrices, use case-insensitive comparison
 2020-06-04 [3119ce4] jdatadecode now handles _ArrayOrder_
 2020-06-04 [89b844c] remove forced root name, update internal test results
 2020-06-02*[15ca7ae] add keeptype option to jsave and saveubjson
 2020-06-02 [7f2cbc4] make jsave and jload work on octave
 2020-06-01*[8829d6b] apply data compression to strings, new datatype char
 2020-06-01 [270cbf6] fix loadmsgpack ND array issue
 2020-06-01*[919f502] add jsave and jload for portable data sharing,update doc
 2020-05-31 [df3a4fa] debug arrayshape related changes and test all demo scripts
 2020-05-31*[fc0b285] adding support to _ArrayShape_ to record special matrices
 2020-05-15*[d88d454] jsonlab is compatible with matlab R2008
 2020-05-13 [86efe89] flag to prevent embedding ND array size specifier
 2020-05-07 [a189a50] use more robust integer type testing
 2020-05-06*[82f5249] saveubjson now implments BJData spec Draft1,https://github.com/fangq/bjdata
 2020-05-03 [34bca22] add prj file to compile a matlab package, close #60
 2020-05-03 [82dfdcc] handle empty array in loadmsgpack, fix #63, patch by stfnp
 2020-03-08 [7499bd8] Merge pull request #61 from j2L4e/patch-1
 2020-02-09*[6984111] add UseMap option to avoid key name conversion
 2019-11-16 [e46221a] if _ArraySize_ has a single length, treat as a row vector
 2019-11-01 [f2bfb65] fix a uint8 upper bound bug
 2019-10-24 [cc4491d] avoid escaping base64 str, avoid double processing preencoded arrayzipdata
 2019-10-24 [4dc76ef] make example script compatible with matlab R2010
 2019-10-24 [ad8be26] disable underscore escaping in octave,update all tests and outputs
 2019-10-24 [d4275c6] reduce jsonopt calls to speed up encoding and decoding
 2019-10-23 [82c9e91] fix invalid jdatadecode example
 2019-10-23 [398539d] reoptimize for speed
 2019-10-22*[650b5ec] enable jdataencode in savejson and saveubjson

JSONlab 1.9.8 (codename: Magnus - beta), FangQ <q.fang (at) neu.edu>

 2019-10-22*[650b5ec] enable preencode by default for savejson and saveubjson
 2019-10-21 [0f870c0] make demos to run with jdataencode, but still have issues
 2019-10-21*[874945f] decode graph data, encode non-char-keyed map data
 2019-10-18 [11712b7] add any2jd, pass opt to name check, add more options
 2019-10-18*[f97de9b] extract name encoding/decoding to separate function, like in easyh5
 2019-10-17*[9d0fd4a] rewrite jdataencode
 2019-10-15 [23f14d6] minor updates to make msgpack to work on octave
 2019-10-14 [04d6c04] update encoding and decoding function help info
 2019-09-16*[689cb40] support lz4 and lz4hc compression via zmat v0.9
 2019-09-03 [2aa6591] add conditions to use the U marker
 2019-08-20 [31eabba] fix table transpose issue for uniform type tables
 2019-08-13 [cdb218d] use iso2mesh original function isoctavemesh in place of isoctave
 2019-07-18 [6c44724] Add Encoding option to loadjson and savejson
 2019-07-11*[06d33aa] update zmat test to support zmat v0.8 mox-the-fox
 2019-07-09 [6a4821c] fix 2d array transpose issue, close #54
 2019-06-24 [fb5b240] update format for table objects
 2019-06-24*[eba4078] saving table objects with new syntax
 2019-06-20 [6803542] fix ubjson array output bug
 2019-06-18 [69006d5] encode and decode non-string keyed maps
 2019-06-14 [bf26892] allow to decode jdata structures loaded from jsonencode from matlab
 2019-06-12 [3eb6d56] change ArrayCompression keywords to ArrayZip to be short
 2019-06-12*[e5f2ffb] complete saveubjson debug mode, add compression example
 2019-06-11 [ebbcfd2] pass formatversion tag to jdatadecode
 2019-06-10*[95b2eb0] add jdataencode and jdatadecode
 2019-06-10*[f86219d] major update: use row-major for N-D array, incompatible with old JSONLab
 2019-06-02 [63ff948] handle nestarray in json and ubjson
 2019-06-01 [f421b14] add a modified msgpack decoder based on Bastian Bechtold's transplant project
 2019-05-31 [428b47f] fix savemsgpack input test
 2019-05-31 [0ff5d47] support table in ubjson,add demo for handles,containers.Map and datetime and tables
 2019-05-31*[0c467ee] support lzma and lzip compression decompression via zmat toolbox (http://github.com/fangq/zmat)
 2019-05-31 [599ee4c] support categorical data
 2019-05-31 [15c4b8d] completely remove global var using nested functions
 2019-05-30*[d47be45] fast bracket matching
 2019-05-30 [1993a24] recursively processing output
 2019-05-30 [d1f7ee8] fix bracket matching, transpose _ArrayData_; convert irregular array to cell
 2019-05-24*[0ec2d01] rewriting fastarrayparser, 10x faster for Octave, close #4 with fast bracket matching
 2019-05-22*[d8c19b8] add support to MessagePack, close #53, add NestArray option, close #6
 2019-05-19*[c87e7d2] support containers.Map

JSONlab 1.9 (codename: Magnus - alpha), FangQ <q.fang (at) neu.edu>

 2019-05-06 [25ad795] unescape string in loadjson.m
 2019-05-04 [2e317c9] explain extra compression fields
 2019-05-02 [1b1be65] avoid side effect of removing singletarray
 2019-05-02*[8360fd1] support zmat based base64 encoding and decoding
 2019-05-01*[c797bb2] integrating zmat, for zlib/gzip data compression
 2019-04-29 [70551fe] remove warnings from matlab
 2019-04-28 [0d61c4b] complete data compression support, close #52
 2019-04-27 [804115b] avoid typecast error
 2019-04-27 [c166aa7] change default compressarraysize to 100
 2019-04-27*[3322f6f] major new feature: support array compression and decompression
 2019-03-13*[9c01046] support saving function handles, close #51
 2019-03-13 [a8fde38] add option to parse string array or convert to char, close #50
 2019-03-12 [ed2645e] treat string array as cell array in newer matlab
 2018-11-18 [c3eb021] allow saving uint64 integers in saveubjson, fix #49

JSONlab 1.8 (codename: Nominus), FangQ <q.fang (at) neu.edu>

 2018-07-12 [03a6c25] update documentation, bump version to 1.8, tag Nominus
 2018-07-12*[1597106] add patch provided by pjkoprowski to support MATLAB table, add RowNames support, fix #29
 2018-07-12 [f16cc57] fix #31, throw an error when : array construct is used
 2018-07-12 [956e000] drop octave 3.x support, fix ubjson error in octave
 2018-07-12 [e090f0a] fix octave warning for saveubjson
 2018-07-12*[34284c7] fix issues #34 #39 #44 and #45, support double-quoted strings
 2017-09-06 [474d8c8] Merge pull request #41 from dasantonym/master
 2017-08-07*[38b24fb] added package.json to be able to intall via npm package manager, converted readme to utf-8, added basic .gitignore file
 2017-07-19 [ae7a5d9] Merge pull request #40 from astorfi/master
 2017-07-17 [154ef61] Rename README.txt to README.rst
 2017-03-27 [31b5bdc] simplify condition flow in matching_bracket
 2017-03-27 [86ef12a] avoid error in matlab 2017a, close #34
 2017-02-18 [4a09ac3] Merge pull request #32 from vrichter/master
 2017-02-14 [e67d3a3] respect integer types

JSONlab 1.5 (codename: Nominus - alpha), FangQ <q.fang <at> neu.edu>

 2017/01/02 *use Big-endian format to store floating points (d/D) in saveubjson (Issue #25)
 2017/01/02 *speedup parsing large unstructured data by 2x (Issue #9)
 2017/01/01  make parsing independent of white space (Issue #30)
 2016/08/27  allow to parse array of homogeneous elements (Issue 5)
 2016/08/22  permit [] inside file names in savejson
 2016/01/06  fix a bug that prevents saving to a file in savejson

JSONlab 1.2 (codename: Optimus - Update 2), FangQ <q.fang <at> neu.edu>

 2015/12/16  replacing string concatenation by str cells to gain 2x speed in savejson (Issue#17)
 2015/12/11  fix FileName option case bug (SVN rev#495)
 2015/12/11  add SingletCell option, add SingletArray to replace NoRowBracket (Issue#15,#8)
 2015/11/10  fix bug for inerpreting file names as JSON string - by Mykhailo Bratukha (Pull#14)
 2015/10/16  fix bug for cell with transposed data - by Insik Kim (Pull#12)
 2015/09/25  support exporting matlab object to JSON - by Sertan Senturk (Pull#10, #11)

JSONlab 1.1 (codename: Optimus - Update 1), FangQ <q.fang <at> neu.edu>

 2015/05/05 *massively accelerating loadjson for parsing large collection of unstructured small objects
 2015/05/05  force array bracket in 1x1 struct to maintain depth (Issue#1)
 2015/05/05  parse logicals in loadjson
 2015/05/05  make options case insensitive
 2015/05/01  reading unicode encoded json files (thanks to Sertan Senturk,Issue#3)
 2015/04/30  allow \uXXXX to represent a unicode in a string (Issue#2)
 2015/03/30  save a 0x0 solid real empty array as null and handel empty struct array
 2015/03/30  properly handle escape characters in a string
 2015/01/24 *implement the UBJSON Draft12 new name format
 2015/01/13  correct cell array indentation inconsistency

JSONlab 1.0 (codename: Optimus - Final), FangQ <q.fang <at> neu.edu>

 2015/01/02  polish help info for all major functions, update examples, finalize 1.0
 2014/12/19  fix a bug to strictly respect NoRowBracket in savejson

JSONlab 1.0.0-RC2 (codename: Optimus - RC2), FangQ <q.fang <at> neu.edu>

 2014/11/22  show progress bar in loadjson ('ShowProgress') 
 2014/11/17 *add Compact option in savejson to output compact JSON format ('Compact')
 2014/11/17  add FastArrayParser in loadjson to specify fast parser applicable levels
 2014/09/18 *start official github mirror: https://github.com/fangq/jsonlab

JSONlab 1.0.0-RC1 (codename: Optimus - RC1), FangQ <q.fang <at> neu.edu>

 2014/09/17  fix several compatibility issues when running on octave versions 3.2-3.8
 2014/09/17 *support 2D cell and struct arrays in both savejson and saveubjson
 2014/08/04  escape special characters in a JSON string
 2014/02/16  fix a bug when saving ubjson files

JSONlab 0.9.9 (codename: Optimus - beta), FangQ <q.fang <at> neu.edu>

 2014/01/22  use binary read and write in saveubjson and loadubjson

JSONlab 0.9.8-1 (codename: Optimus - alpha update 1), FangQ <q.fang <at> neu.edu>

 2013/10/07  better round-trip conservation for empty arrays and structs (patch submitted by Yul Kang)

JSONlab 0.9.8 (codename: Optimus - alpha), FangQ <q.fang <at> neu.edu>

 2013/08/23 *universal Binary JSON (UBJSON) support, including both saveubjson and loadubjson

JSONlab 0.9.1 (codename: Rodimus, update 1), FangQ <q.fang <at> neu.edu>

 2012/12/18 *handling of various empty and sparse matrices (fixes submitted by Niclas Borlin)

JSONlab 0.9.0 (codename: Rodimus), FangQ <q.fang <at> neu.edu>

 2012/06/17 *new format for an invalid leading char, unpacking hex code in savejson
 2012/06/01  support JSONP in savejson
 2012/05/25  fix the empty cell bug (reported by Cyril Davin)
 2012/04/05  savejson can save to a file (suggested by Patrick Rapin)

JSONlab 0.8.1 (codename: Sentiel, Update 1), FangQ <q.fang <at> neu.edu>

 2012/02/28  loadjson quotation mark escape bug, see http://bit.ly/yyk1nS
 2012/01/25  patch to handle root-less objects, contributed by Blake Johnson

JSONlab 0.8.0 (codename: Sentiel), FangQ <q.fang <at> neu.edu>

 2012/01/13 *speed up loadjson by 20 fold when parsing large data arrays in matlab
 2012/01/11  remove row bracket if an array has 1 element, suggested by Mykel Kochenderfer
 2011/12/22 *accept sequence of 'param',value input in savejson and loadjson
 2011/11/18  fix struct array bug reported by Mykel Kochenderfer

JSONlab 0.5.1 (codename: Nexus Update 1), FangQ <q.fang <at> neu.edu>

 2011/10/21  fix a bug in loadjson, previous code does not use any of the acceleration
 2011/10/20  loadjson supports JSON collections - concatenated JSON objects

JSONlab 0.5.0 (codename: Nexus), FangQ <q.fang <at> neu.edu>

 2011/10/16  package and release jsonlab 0.5.0
 2011/10/15 *add json demo and regression test, support cpx numbers, fix double quote bug
 2011/10/11 *speed up readjson dramatically, interpret _Array* tags, show data in root level
 2011/10/10  create jsonlab project, start jsonlab website, add online documentation
 2011/10/07 *speed up savejson by 25x using sprintf instead of mat2str, add options support
 2011/10/06 *savejson works for structs, cells and arrays
 2011/09/09  derive loadjson from JSON parser from MATLAB Central, draft savejson.m
Powered by Habitat