123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- ===============================================================================
- = JSONLab =
- = An open-source MATLAB/Octave JSON encoder and decoder =
- ===============================================================================
- *Copyright (C) 2011-2015 Qianqian Fang <fangq at nmr.mgh.harvard.edu>
- *License: BSD License, see License_BSD.txt for details
- *Version: 1.0 (Optimus - Final)
- -------------------------------------------------------------------------------
- Table of Content:
- I. Introduction
- II. Installation
- III.Using JSONLab
- IV. Known Issues and TODOs
- V. Contribution and feedback
- -------------------------------------------------------------------------------
- I. Introduction
- JSON ([http://www.json.org/ JavaScript Object Notation]) is a highly portable,
- human-readable and "[http://en.wikipedia.org/wiki/JSON fat-free]" text format
- to represent complex and hierarchical data. It is as powerful as
- [http://en.wikipedia.org/wiki/XML XML], but less verbose. JSON format is widely
- used for data-exchange in applications, and is essential for the wild success
- of [http://en.wikipedia.org/wiki/Ajax_(programming) Ajax] and
- [http://en.wikipedia.org/wiki/Web_2.0 Web2.0].
- UBJSON (Universal Binary JSON) is a binary JSON format, specifically
- optimized for compact file size and better performance while keeping
- the semantics as simple as the text-based JSON format. Using the UBJSON
- format allows to wrap complex binary data in a flexible and extensible
- structure, making it possible to process complex and large dataset
- without accuracy loss due to text conversions.
- We envision that both JSON and its binary version will serve as part of
- the mainstream data-exchange formats for scientific research in the future.
- It will provide the flexibility and generality achieved by other popular
- general-purpose file specifications, such as
- [http://www.hdfgroup.org/HDF5/whatishdf5.html HDF5], with significantly
- reduced complexity and enhanced performance.
- JSONLab is a free and open-source implementation of a JSON/UBJSON encoder
- and a decoder in the native MATLAB language. It can be used to convert a MATLAB
- data structure (array, struct, cell, struct array and cell array) into
- JSON/UBJSON formatted strings, or to decode a JSON/UBJSON file into MATLAB
- data structure. JSONLab supports both MATLAB and
- [http://www.gnu.org/software/octave/ GNU Octave] (a free MATLAB clone).
- -------------------------------------------------------------------------------
- II. Installation
- The installation of JSONLab is no different than any other simple
- MATLAB toolbox. You only need to download/unzip the JSONLab package
- to a folder, and add the folder's path to MATLAB/Octave's path list
- by using the following command:
- addpath('/path/to/jsonlab');
- If you want to add this path permanently, you need to type "pathtool",
- browse to the jsonlab root folder and add to the list, then click "Save".
- Then, run "rehash" in MATLAB, and type "which loadjson", if you see an
- output, that means JSONLab is installed for MATLAB/Octave.
- -------------------------------------------------------------------------------
- III.Using JSONLab
- JSONLab provides two functions, loadjson.m -- a MATLAB->JSON decoder,
- and savejson.m -- a MATLAB->JSON encoder, for the text-based JSON, and
- two equivallent functions -- loadubjson and saveubjson for the binary
- JSON. The detailed help info for the four functions can be found below:
- === loadjson.m ===
- <pre>
- data=loadjson(fname,opt)
- or
- data=loadjson(fname,'param1',value1,'param2',value2,...)
-
- parse a JSON (JavaScript Object Notation) file or string
-
- authors:Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
- created on 2011/09/09, including previous works from
-
- Nedialko Krouchev: http://www.mathworks.com/matlabcentral/fileexchange/25713
- created on 2009/11/02
- François Glineur: http://www.mathworks.com/matlabcentral/fileexchange/23393
- created on 2009/03/22
- Joel Feenstra:
- http://www.mathworks.com/matlabcentral/fileexchange/20565
- created on 2008/07/03
-
- $Id: loadjson.m 452 2014-11-22 16:43:33Z fangq $
-
- input:
- fname: input file name, if fname contains "{}" or "[]", fname
- will be interpreted as a JSON string
- opt: a struct to store parsing options, opt can be replaced by
- a list of ('param',value) pairs - the param string is equivallent
- to a field in opt. opt can have the following
- fields (first in [.|.] is the default)
-
- opt.SimplifyCell [0|1]: if set to 1, loadjson will call cell2mat
- for each element of the JSON data, and group
- arrays based on the cell2mat rules.
- opt.FastArrayParser [1|0 or integer]: if set to 1, use a
- speed-optimized array parser when loading an
- array object. The fast array parser may
- collapse block arrays into a single large
- array similar to rules defined in cell2mat; 0 to
- use a legacy parser; if set to a larger-than-1
- value, this option will specify the minimum
- dimension to enable the fast array parser. For
- example, if the input is a 3D array, setting
- FastArrayParser to 1 will return a 3D array;
- setting to 2 will return a cell array of 2D
- arrays; setting to 3 will return to a 2D cell
- array of 1D vectors; setting to 4 will return a
- 3D cell array.
- opt.ShowProgress [0|1]: if set to 1, loadjson displays a progress bar.
-
- output:
- dat: a cell array, where {...} blocks are converted into cell arrays,
- and [...] are converted to arrays
-
- examples:
- dat=loadjson('{"obj":{"string":"value","array":[1,2,3]}}')
- dat=loadjson(['examples' filesep 'example1.json'])
- dat=loadjson(['examples' filesep 'example1.json'],'SimplifyCell',1)
- </pre>
- === savejson.m ===
- <pre>
- json=savejson(rootname,obj,filename)
- or
- json=savejson(rootname,obj,opt)
- json=savejson(rootname,obj,'param1',value1,'param2',value2,...)
-
- convert a MATLAB object (cell, struct or array) into a JSON (JavaScript
- Object Notation) string
-
- author: Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
- created on 2011/09/09
-
- $Id: savejson.m 458 2014-12-19 22:17:17Z fangq $
-
- input:
- rootname: the name of the root-object, when set to '', the root name
- is ignored, however, when opt.ForceRootName is set to 1 (see below),
- the MATLAB variable name will be used as the root name.
- obj: a MATLAB object (array, cell, cell array, struct, struct array).
- filename: a string for the file name to save the output JSON data.
- opt: a struct for additional options, ignore to use default values.
- opt can have the following fields (first in [.|.] is the default)
-
- opt.FileName [''|string]: a file name to save the output JSON data
- opt.FloatFormat ['%.10g'|string]: format to show each numeric element
- of a 1D/2D array;
- opt.ArrayIndent [1|0]: if 1, output explicit data array with
- precedent indentation; if 0, no indentation
- opt.ArrayToStruct[0|1]: when set to 0, savejson outputs 1D/2D
- array in JSON array format; if sets to 1, an
- array will be shown as a struct with fields
- "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for
- sparse arrays, the non-zero elements will be
- saved to _ArrayData_ field in triplet-format i.e.
- (ix,iy,val) and "_ArrayIsSparse_" will be added
- with a value of 1; for a complex array, the
- _ArrayData_ array will include two columns
- (4 for sparse) to record the real and imaginary
- parts, and also "_ArrayIsComplex_":1 is added.
- opt.ParseLogical [0|1]: if this is set to 1, logical array elem
- will use true/false rather than 1/0.
- opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single
- numerical element will be shown without a square
- bracket, unless it is the root object; if 0, square
- brackets are forced for any numerical arrays.
- opt.ForceRootName [0|1]: when set to 1 and rootname is empty, savejson
- will use the name of the passed obj variable as the
- root object name; if obj is an expression and
- does not have a name, 'root' will be used; if this
- is set to 0 and rootname is empty, the root level
- will be merged down to the lower level.
- opt.Inf ['"$1_Inf_"'|string]: a customized regular expression pattern
- to represent +/-Inf. The matched pattern is '([-+]*)Inf'
- and $1 represents the sign. For those who want to use
- 1e999 to represent Inf, they can set opt.Inf to '$11e999'
- opt.NaN ['"_NaN_"'|string]: a customized regular expression pattern
- to represent NaN
- opt.JSONP [''|string]: to generate a JSONP output (JSON with padding),
- for example, if opt.JSONP='foo', the JSON data is
- wrapped inside a function call as 'foo(...);'
- opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson
- back to the string form
- opt.SaveBinary [0|1]: 1 - save the JSON file in binary mode; 0 - text mode.
- opt.Compact [0|1]: 1- out compact JSON format (remove all newlines and tabs)
-
- opt can be replaced by a list of ('param',value) pairs. The param
- string is equivallent to a field in opt and is case sensitive.
- output:
- json: a string in the JSON format (see http://json.org)
-
- examples:
- jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],...
- 'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],...
- 'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;...
- 2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],...
- 'MeshCreator','FangQ','MeshTitle','T6 Cube',...
- 'SpecialData',[nan, inf, -inf]);
- savejson('jmesh',jsonmesh)
- savejson('',jsonmesh,'ArrayIndent',0,'FloatFormat','\t%.5g')
- </pre>
- === loadubjson.m ===
- <pre>
- data=loadubjson(fname,opt)
- or
- data=loadubjson(fname,'param1',value1,'param2',value2,...)
-
- parse a JSON (JavaScript Object Notation) file or string
-
- authors:Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
- created on 2013/08/01
-
- $Id: loadubjson.m 436 2014-08-05 20:51:40Z fangq $
-
- input:
- fname: input file name, if fname contains "{}" or "[]", fname
- will be interpreted as a UBJSON string
- opt: a struct to store parsing options, opt can be replaced by
- a list of ('param',value) pairs - the param string is equivallent
- to a field in opt. opt can have the following
- fields (first in [.|.] is the default)
-
- opt.SimplifyCell [0|1]: if set to 1, loadubjson will call cell2mat
- for each element of the JSON data, and group
- arrays based on the cell2mat rules.
- opt.IntEndian [B|L]: specify the endianness of the integer fields
- in the UBJSON input data. B - Big-Endian format for
- integers (as required in the UBJSON specification);
- L - input integer fields are in Little-Endian order.
-
- output:
- dat: a cell array, where {...} blocks are converted into cell arrays,
- and [...] are converted to arrays
-
- examples:
- obj=struct('string','value','array',[1 2 3]);
- ubjdata=saveubjson('obj',obj);
- dat=loadubjson(ubjdata)
- dat=loadubjson(['examples' filesep 'example1.ubj'])
- dat=loadubjson(['examples' filesep 'example1.ubj'],'SimplifyCell',1)
- </pre>
- === saveubjson.m ===
- <pre>
- json=saveubjson(rootname,obj,filename)
- or
- json=saveubjson(rootname,obj,opt)
- json=saveubjson(rootname,obj,'param1',value1,'param2',value2,...)
-
- convert a MATLAB object (cell, struct or array) into a Universal
- Binary JSON (UBJSON) binary string
-
- author: Qianqian Fang (fangq<at> nmr.mgh.harvard.edu)
- created on 2013/08/17
-
- $Id: saveubjson.m 440 2014-09-17 19:59:45Z fangq $
-
- input:
- rootname: the name of the root-object, when set to '', the root name
- is ignored, however, when opt.ForceRootName is set to 1 (see below),
- the MATLAB variable name will be used as the root name.
- obj: a MATLAB object (array, cell, cell array, struct, struct array)
- filename: a string for the file name to save the output UBJSON data
- opt: a struct for additional options, ignore to use default values.
- opt can have the following fields (first in [.|.] is the default)
-
- opt.FileName [''|string]: a file name to save the output JSON data
- opt.ArrayToStruct[0|1]: when set to 0, saveubjson outputs 1D/2D
- array in JSON array format; if sets to 1, an
- array will be shown as a struct with fields
- "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for
- sparse arrays, the non-zero elements will be
- saved to _ArrayData_ field in triplet-format i.e.
- (ix,iy,val) and "_ArrayIsSparse_" will be added
- with a value of 1; for a complex array, the
- _ArrayData_ array will include two columns
- (4 for sparse) to record the real and imaginary
- parts, and also "_ArrayIsComplex_":1 is added.
- opt.ParseLogical [1|0]: if this is set to 1, logical array elem
- will use true/false rather than 1/0.
- opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single
- numerical element will be shown without a square
- bracket, unless it is the root object; if 0, square
- brackets are forced for any numerical arrays.
- opt.ForceRootName [0|1]: when set to 1 and rootname is empty, saveubjson
- will use the name of the passed obj variable as the
- root object name; if obj is an expression and
- does not have a name, 'root' will be used; if this
- is set to 0 and rootname is empty, the root level
- will be merged down to the lower level.
- opt.JSONP [''|string]: to generate a JSONP output (JSON with padding),
- for example, if opt.JSON='foo', the JSON data is
- wrapped inside a function call as 'foo(...);'
- opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson
- back to the string form
-
- opt can be replaced by a list of ('param',value) pairs. The param
- string is equivallent to a field in opt and is case sensitive.
- output:
- json: a binary string in the UBJSON format (see http://ubjson.org)
-
- examples:
- jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],...
- 'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],...
- 'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;...
- 2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],...
- 'MeshCreator','FangQ','MeshTitle','T6 Cube',...
- 'SpecialData',[nan, inf, -inf]);
- saveubjson('jsonmesh',jsonmesh)
- saveubjson('jsonmesh',jsonmesh,'meshdata.ubj')
- </pre>
- === examples ===
- Under the "examples" folder, you can find several scripts to demonstrate the
- basic utilities of JSONLab. Running the "demo_jsonlab_basic.m" script, you
- will see the conversions from MATLAB data structure to JSON text and backward.
- In "jsonlab_selftest.m", we load complex JSON files downloaded from the Internet
- and validate the loadjson/savejson functions for regression testing purposes.
- Similarly, a "demo_ubjson_basic.m" script is provided to test the saveubjson
- and loadubjson pairs for various matlab data structures.
- Please run these examples and understand how JSONLab works before you use
- it to process your data.
- -------------------------------------------------------------------------------
- IV. Known Issues and TODOs
- JSONLab has several known limitations. We are striving to make it more general
- and robust. Hopefully in a few future releases, the limitations become less.
- Here are the known issues:
- # 3D or higher dimensional cell/struct-arrays will be converted to 2D arrays;
- # When processing names containing multi-byte characters, Octave and MATLAB \
- can give different field-names; you can use feature('DefaultCharacterSet','latin1') \
- in MATLAB to get consistant results
- # savejson can not handle class and dataset.
- # saveubjson converts a logical array into a uint8 ([U]) array
- # an unofficial N-D array count syntax is implemented in saveubjson. We are \
- actively communicating with the UBJSON spec maintainer to investigate the \
- possibility of making it upstream
- # loadubjson can not parse all UBJSON Specification (Draft 9) compliant \
- files, however, it can parse all UBJSON files produced by saveubjson.
- -------------------------------------------------------------------------------
- V. Contribution and feedback
- JSONLab is an open-source project. This means you can not only use it and modify
- it as you wish, but also you can contribute your changes back to JSONLab so
- that everyone else can enjoy the improvement. For anyone who want to contribute,
- please download JSONLab source code from it's subversion repository by using the
- following command:
- svn checkout svn://svn.code.sf.net/p/iso2mesh/code/trunk/jsonlab jsonlab
- You can make changes to the files as needed. Once you are satisfied with your
- changes, and ready to share it with others, please cd the root directory of
- JSONLab, and type
- svn diff > yourname_featurename.patch
- You then email the .patch file to JSONLab's maintainer, Qianqian Fang, at
- the email address shown in the beginning of this file. Qianqian will review
- the changes and commit it to the subversion if they are satisfactory.
- We appreciate any suggestions and feedbacks from you. Please use iso2mesh's
- mailing list to report any questions you may have with JSONLab:
- http://groups.google.com/group/iso2mesh-users?hl=en&pli=1
- (Subscription to the mailing list is needed in order to post messages).
|