63
63
64
64
-type decode_result () :: {ok , jsone :json_value (), Rest :: binary ()} | {error , {Reason :: term (), [jsone :stack_item ()]}}.
65
65
66
- -record (decode_opt_v2 ,
67
- {object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
68
- allow_ctrl_chars = false :: boolean (),
69
- reject_invalid_utf8 = false :: boolean (),
70
- keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
71
- undefined_as_null = false :: boolean (),
72
- duplicate_map_keys = first :: first | last }).
66
+ -record (decode_opt_v2 , {
67
+ object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
68
+ allow_ctrl_chars = false :: boolean (),
69
+ reject_invalid_utf8 = false :: boolean (),
70
+ keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
71
+ undefined_as_null = false :: boolean (),
72
+ duplicate_map_keys = first :: first | last
73
+ }).
73
74
-define (OPT , # decode_opt_v2 ).
74
75
-type opt() :: #decode_opt_v2{}.
75
76
77
+
76
78
% %--------------------------------------------------------------------------------
77
79
% % Exported Functions
78
80
% %--------------------------------------------------------------------------------
79
81
- spec decode (binary ()) -> decode_result ().
80
82
decode (Json ) ->
81
83
decode (Json , []).
82
84
85
+
83
86
- spec decode (binary (), [jsone :decode_option ()]) -> decode_result ().
84
87
decode (<<Json /binary >>, Options ) ->
85
88
Opt = parse_options (Options ),
86
89
whitespace (Json , value , [], <<" " >>, Opt ).
87
90
91
+
88
92
% %--------------------------------------------------------------------------------
89
93
% % Internal Functions
90
94
% %--------------------------------------------------------------------------------
@@ -101,6 +105,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
101
105
whitespace (Bin , {object_next , [{Key , Value } | Members ]}, Nexts , Buf , Opt )
102
106
end .
103
107
108
+
104
109
- spec whitespace (binary (), whitespace_next (), [next ()], binary (), opt ()) -> decode_result ().
105
110
whitespace (<<$ , Bin /binary >>, Next , Nexts , Buf , Opt ) ->
106
111
whitespace (Bin , Next , Nexts , Buf , Opt );
@@ -128,6 +133,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
128
133
object_next (Bin , Members , Nexts , Buf , Opt )
129
134
end .
130
135
136
+
131
137
- spec value (binary (), [next ()], binary (), opt ()) -> decode_result ().
132
138
value (<<" false" , Bin /binary >>, Nexts , Buf , Opt ) ->
133
139
next (Bin , false , Nexts , Buf , Opt );
@@ -146,12 +152,14 @@ value(<<$", Bin/binary>>, Nexts, Buf, Opt) ->
146
152
value (<<Bin /binary >>, Nexts , Buf , Opt ) ->
147
153
number (Bin , Nexts , Buf , Opt ).
148
154
155
+
149
156
- spec array (binary (), [next ()], binary (), opt ()) -> decode_result ().
150
157
array (<<$] , Bin /binary >>, Nexts , Buf , Opt ) ->
151
158
next (Bin , [], Nexts , Buf , Opt );
152
159
array (<<Bin /binary >>, Nexts , Buf , Opt ) ->
153
160
value (Bin , [{array_next , []} | Nexts ], Buf , Opt ).
154
161
162
+
155
163
- spec array_next (binary (), [jsone :json_value ()], [next ()], binary (), opt ()) -> decode_result ().
156
164
array_next (<<$] , Bin /binary >>, Values , Nexts , Buf , Opt ) ->
157
165
next (Bin , lists :reverse (Values ), Nexts , Buf , Opt );
@@ -160,18 +168,21 @@ array_next(<<$,, Bin/binary>>, Values, Nexts, Buf, Opt) ->
160
168
array_next (Bin , Values , Nexts , Buf , Opt ) ->
161
169
? ERROR (array_next , [Bin , Values , Nexts , Buf , Opt ]).
162
170
171
+
163
172
- spec object (binary (), [next ()], binary (), opt ()) -> decode_result ().
164
173
object (<<$} , Bin /binary >>, Nexts , Buf , Opt ) ->
165
174
next (Bin , make_object ([], Opt ), Nexts , Buf , Opt );
166
175
object (<<Bin /binary >>, Nexts , Buf , Opt ) ->
167
176
object_key (Bin , [], Nexts , Buf , Opt ).
168
177
178
+
169
179
- spec object_key (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
170
180
object_key (<<$" , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
171
181
string (Bin , byte_size (Buf ), [{object_value , Members } | Nexts ], Buf , Opt );
172
182
object_key (<<Bin /binary >>, Members , Nexts , Buf , Opt ) ->
173
183
? ERROR (object_key , [Bin , Members , Nexts , Buf , Opt ]).
174
184
185
+
175
186
- spec object_value (binary (), jsone :json_string (), jsone :json_object_members (), [next ()], binary (), opt ()) ->
176
187
decode_result ().
177
188
object_value (<<$: , Bin /binary >>, Key , Members , Nexts , Buf , Opt ) ->
@@ -180,6 +191,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
180
191
? ERROR (object_value , [Bin , Key , Members , Nexts , Buf , Opt ]).
181
192
182
193
- compile ({inline , [object_key / 2 ]}).
194
+
195
+
183
196
object_key (Key , ? OPT {keys = binary }) ->
184
197
Key ;
185
198
object_key (Key , ? OPT {keys = atom }) ->
@@ -194,6 +207,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
194
207
Key
195
208
end .
196
209
210
+
197
211
- spec object_next (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
198
212
object_next (<<$} , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
199
213
next (Bin , make_object (Members , Opt ), Nexts , Buf , Opt );
@@ -202,10 +216,12 @@ object_next(<<$,, Bin/binary>>, Members, Nexts, Buf, Opt) ->
202
216
object_next (Bin , Members , Nexts , Buf , Opt ) ->
203
217
? ERROR (object_next , [Bin , Members , Nexts , Buf , Opt ]).
204
218
219
+
205
220
- spec string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
206
221
string (<<Bin /binary >>, Start , Nexts , Buf , Opt ) ->
207
222
string (Bin , Bin , Start , Nexts , Buf , Opt ).
208
223
224
+
209
225
- spec string (binary (), binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
210
226
string (<<$" , Bin /binary >>, Base , Start , Nexts , Buf , Opt ) ->
211
227
Prefix = binary :part (Base , 0 , byte_size (Base ) - byte_size (Bin ) - 1 ),
@@ -252,6 +268,7 @@ string(<<C/utf8, Bin/binary>>, Base, Start, Nexts, Buf, Opt) when 16#20 =< C ->
252
268
string (Bin , Base , Start , Nexts , Buf , Opt ) ->
253
269
? ERROR (string , [Bin , Base , Start , Nexts , Buf , Opt ]).
254
270
271
+
255
272
- spec unicode_string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
256
273
unicode_string (<<N :4 /binary , Bin /binary >>, Start , Nexts , Buf , Opt ) ->
257
274
try
@@ -290,12 +307,14 @@ unicode_string(<<N:4/binary, Bin/binary>>, Start, Nexts, Buf, Opt) ->
290
307
unicode_string (Bin , Start , Nexts , Buf , Opt ) ->
291
308
? ERROR (unicode_string , [Bin , Start , Nexts , Buf , Opt ]).
292
309
310
+
293
311
- spec number (binary (), [next ()], binary (), opt ()) -> decode_result ().
294
312
number (<<$- , Bin /binary >>, Nexts , Buf , Opt ) ->
295
313
number_integer_part (Bin , - 1 , Nexts , Buf , Opt );
296
314
number (<<Bin /binary >>, Nexts , Buf , Opt ) ->
297
315
number_integer_part (Bin , 1 , Nexts , Buf , Opt ).
298
316
317
+
299
318
- spec number_integer_part (binary (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
300
319
number_integer_part (<<$0 , Bin /binary >>, Sign , Nexts , Buf , Opt ) ->
301
320
number_fraction_part (Bin , Sign , 0 , Nexts , Buf , Opt );
@@ -304,18 +323,21 @@ number_integer_part(<<C, Bin/binary>>, Sign, Nexts, Buf, Opt) when $1 =< C, C =<
304
323
number_integer_part (Bin , Sign , Nexts , Buf , Opt ) ->
305
324
? ERROR (number_integer_part , [Bin , Sign , Nexts , Buf , Opt ]).
306
325
326
+
307
327
- spec number_integer_part_rest (binary (), non_neg_integer (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
308
328
number_integer_part_rest (<<C , Bin /binary >>, N , Sign , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
309
329
number_integer_part_rest (Bin , N * 10 + C - $0 , Sign , Nexts , Buf , Opt );
310
330
number_integer_part_rest (<<Bin /binary >>, N , Sign , Nexts , Buf , Opt ) ->
311
331
number_fraction_part (Bin , Sign , N , Nexts , Buf , Opt ).
312
332
333
+
313
334
- spec number_fraction_part (binary (), 1 | - 1 , non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
314
335
number_fraction_part (<<$. , Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
315
336
number_fraction_part_rest (Bin , Sign , Int , 0 , Nexts , Buf , Opt );
316
337
number_fraction_part (<<Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
317
338
number_exponation_part (Bin , Sign * Int , 0 , Nexts , Buf , Opt ).
318
339
340
+
319
341
- spec number_fraction_part_rest (binary (), 1 | - 1 , non_neg_integer (), non_neg_integer (), [next ()], binary (), opt ()) ->
320
342
decode_result ().
321
343
number_fraction_part_rest (<<C , Bin /binary >>, Sign , N , DecimalOffset , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
@@ -325,6 +347,7 @@ number_fraction_part_rest(<<Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Op
325
347
number_fraction_part_rest (Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ) ->
326
348
? ERROR (number_fraction_part_rest , [Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ]).
327
349
350
+
328
351
- spec number_exponation_part (binary (), integer (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
329
352
number_exponation_part (<<$e , $+ , Bin /binary >>, N , DecimalOffset , Nexts , Buf , Opt ) ->
330
353
number_exponation_part (Bin , N , DecimalOffset , 1 , 0 , true , Nexts , Buf , Opt );
@@ -346,6 +369,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
346
369
next (Bin , N / math :pow (10 , DecimalOffset ), Nexts , Buf , Opt )
347
370
end .
348
371
372
+
349
373
- spec number_exponation_part (binary (),
350
374
integer (),
351
375
non_neg_integer (),
@@ -376,6 +400,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Ne
376
400
number_exponation_part (Bin , N , DecimalOffset , ExpSign , Exp , IsFirst , Nexts , Buf , Opt ) ->
377
401
? ERROR (number_exponation_part , [Bin , N , DecimalOffset , ExpSign , Exp , IsFirst , Nexts , Buf , Opt ]).
378
402
403
+
379
404
- spec make_object (jsone :json_object_members (), opt ()) -> jsone :json_object ().
380
405
make_object (Members , ? OPT {object_format = tuple }) ->
381
406
{lists :reverse (Members )};
@@ -388,10 +413,12 @@ make_object([], _) ->
388
413
make_object (Members , _ ) ->
389
414
lists :reverse (Members ).
390
415
416
+
391
417
- spec parse_options ([jsone :decode_option ()]) -> opt ().
392
418
parse_options (Options ) ->
393
419
parse_option (Options , ? OPT {}).
394
420
421
+
395
422
- spec parse_option ([jsone :decode_option ()], opt ()) -> opt ().
396
423
parse_option ([], Opt ) ->
397
424
Opt ;
0 commit comments