|
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