|
29 | 29 | else
|
30 | 30 | bytes=fname;
|
31 | 31 | end
|
| 32 | + |
| 33 | + opt=varargin2struct(varargin{:}); |
| 34 | + opt.simplifycell=jsonopt('SimplifyCell',0,opt); |
| 35 | + |
32 | 36 | jsoncount=1;
|
33 | 37 | idx=0;
|
34 | 38 | while idx <= length(bytes)
|
35 |
| - [obj, idx] = parse(uint8(bytes(:)), 1); |
| 39 | + [obj, idx] = parse(uint8(bytes(:)), 1, opt); |
36 | 40 | data{jsoncount}=obj;
|
37 | 41 | jsoncount=jsoncount+1;
|
38 | 42 | end
|
|
44 | 48 | if(iscell(data))
|
45 | 49 | data=cellfun(@(x) jdatadecode(x),data,'UniformOutput',false);
|
46 | 50 | elseif(isstruct(data))
|
47 |
| - data=jdatadecode(data,'Base64',0); |
| 51 | + data=jdatadecode(data,'Base64',0, opt); |
48 | 52 | end
|
49 | 53 | end
|
50 | 54 |
|
51 |
| -function [obj, idx] = parse(bytes, idx) |
| 55 | +function [obj, idx] = parse(bytes, idx, varargin) |
52 | 56 | % masks:
|
53 | 57 | b10000000 = 128;
|
54 | 58 | b01111111 = 127;
|
|
78 | 82 | elseif bitand(b11110000, currentbyte) == b10000000
|
79 | 83 | % decode fixmap
|
80 | 84 | len = double(bitand(b00001111, currentbyte));
|
81 |
| - [obj, idx] = parsemap(len, bytes, idx+1); |
| 85 | + [obj, idx] = parsemap(len, bytes, idx+1, varargin{:}); |
82 | 86 | return
|
83 | 87 | elseif bitand(b11110000, currentbyte) == b10010000
|
84 | 88 | % decode fixarray
|
85 | 89 | len = double(bitand(b00001111, currentbyte));
|
86 |
| - [obj, idx] = parsearray(len, bytes, idx+1); |
| 90 | + [obj, idx] = parsearray(len, bytes, idx+1, varargin{:}); |
87 | 91 | return
|
88 | 92 | elseif bitand(b11100000, currentbyte) == b10100000
|
89 | 93 | % decode fixstr
|
|
172 | 176 | [obj, idx] = parsestring(len, bytes, idx+5);
|
173 | 177 | case 220 % array16
|
174 | 178 | len = double(bytes2scalar(bytes(idx+1:idx+2), 'uint16'));
|
175 |
| - [obj, idx] = parsearray(len, bytes, idx+3); |
| 179 | + [obj, idx] = parsearray(len, bytes, idx+3, varargin{:}); |
176 | 180 | case 221 % array32
|
177 | 181 | len = double(bytes2scalar(bytes(idx+1:idx+4), 'uint32'));
|
178 |
| - [obj, idx] = parsearray(len, bytes, idx+5); |
| 182 | + [obj, idx] = parsearray(len, bytes, idx+5, varargin{:}); |
179 | 183 | case 222 % map16
|
180 | 184 | len = double(bytes2scalar(bytes(idx+1:idx+2), 'uint16'));
|
181 |
| - [obj, idx] = parsemap(len, bytes, idx+3); |
| 185 | + [obj, idx] = parsemap(len, bytes, idx+3, varargin{:}); |
182 | 186 | case 223 % map32
|
183 | 187 | len = double(bytes2scalar(bytes(idx+1:idx+4), 'uint32'));
|
184 |
| - [obj, idx] = parsemap(len, bytes, idx+5); |
| 188 | + [obj, idx] = parsemap(len, bytes, idx+5, varargin{:}); |
185 | 189 | otherwise
|
186 | 190 | error('transplant:parsemsgpack:unknowntype', ...
|
187 | 191 | ['Unknown type "' dec2bin(currentbyte) '"']);
|
|
213 | 217 | idx = idx + len + 1;
|
214 | 218 | end
|
215 | 219 |
|
216 |
| -function [out, idx] = parsearray(len, bytes, idx) |
217 |
| - out = cell(1, len); |
| 220 | +function [out, idx] = parsearray(len, bytes, idx, varargin) |
| 221 | + out = cell(len,1); |
218 | 222 | for n=1:len
|
219 |
| - [out{n}, idx] = parse(bytes, idx); |
| 223 | + [out{n}, idx] = parse(bytes, idx, varargin{:}); |
220 | 224 | end
|
221 | 225 | if(isnumeric(out{1}))
|
222 | 226 | try
|
|
232 | 236 | end
|
233 | 237 | end
|
234 | 238 |
|
235 |
| -function [out, idx] = parsemap(len, bytes, idx) |
| 239 | +function [out, idx] = parsemap(len, bytes, idx, varargin) |
236 | 240 | out = struct();
|
237 | 241 | for n=1:len
|
238 |
| - [key, idx] = parse(bytes, idx); |
239 |
| - [out.(encodevarname(char(key))), idx] = parse(bytes, idx); |
| 242 | + [key, idx] = parse(bytes, idx, varargin{:}); |
| 243 | + [out.(encodevarname(char(key))), idx] = parse(bytes, idx, varargin{:}); |
240 | 244 | end
|
241 | 245 | end
|
0 commit comments