65
65
jsone :incomplete () |
66
66
{error , {Reason :: term (), [jsone :stack_item ()]}}.
67
67
68
- -record (decode_opt_v3 ,
69
- {object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
70
- allow_ctrl_chars = false :: boolean (),
71
- reject_invalid_utf8 = false :: boolean (),
72
- keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
73
- undefined_as_null = false :: boolean (),
74
- duplicate_map_keys = first :: first | last ,
75
- stream = false :: boolean ()}).
68
+ -record (decode_opt_v3 , {
69
+ object_format = ? DEFAULT_OBJECT_FORMAT :: tuple | proplist | map ,
70
+ allow_ctrl_chars = false :: boolean (),
71
+ reject_invalid_utf8 = false :: boolean (),
72
+ keys = binary :: 'binary' | 'atom' | 'existing_atom' | 'attempt_atom' ,
73
+ undefined_as_null = false :: boolean (),
74
+ duplicate_map_keys = first :: first | last ,
75
+ stream = false :: boolean ()
76
+ }).
76
77
-define (OPT , # decode_opt_v3 ).
77
78
-type opt() :: #decode_opt_v3{}.
78
79
80
+
79
81
% %--------------------------------------------------------------------------------
80
82
% % Exported Functions
81
83
% %--------------------------------------------------------------------------------
82
84
- spec decode (binary ()) -> decode_result ().
83
85
decode (Json ) ->
84
86
decode (Json , []).
85
87
88
+
86
89
- spec decode (binary (), [jsone :decode_option ()]) -> decode_result ().
87
90
decode (<<Json /binary >>, Options ) ->
88
91
Opt = parse_options (Options ),
@@ -93,6 +96,7 @@ decode(<<Json/binary>>, Options) ->
93
96
Result
94
97
end .
95
98
99
+
96
100
% %--------------------------------------------------------------------------------
97
101
% % Internal Functions
98
102
% %--------------------------------------------------------------------------------
@@ -110,6 +114,7 @@ next(<<Bin/binary>>, Value, [Next | Nexts], Buf, Opt) ->
110
114
whitespace (Bin , {object_next , [{Key , Value } | Members ]}, Nexts , Buf , Opt )
111
115
end .
112
116
117
+
113
118
- spec whitespace (binary (), whitespace_next (), [next ()], binary (), opt ()) -> decode_result ().
114
119
whitespace (<<$ , Bin /binary >>, Next , Nexts , Buf , Opt ) ->
115
120
whitespace (Bin , Next , Nexts , Buf , Opt );
@@ -139,6 +144,7 @@ whitespace(<<Bin/binary>>, Next, Nexts, Buf, Opt) ->
139
144
object_next (Bin , Members , Nexts , Buf , Opt )
140
145
end .
141
146
147
+
142
148
- spec value (binary (), [next ()], binary (), opt ()) -> decode_result ().
143
149
value (<<" false" , Bin /binary >>, Nexts , Buf , Opt ) ->
144
150
next (Bin , false , Nexts , Buf , Opt );
@@ -165,6 +171,7 @@ value(<<C, _/binary>> = Bin, Nexts, Buf, Opt) when
165
171
value (<<Bin /binary >>, Nexts , Buf , Opt ) ->
166
172
number (Bin , Nexts , Buf , Opt ).
167
173
174
+
168
175
- spec array (binary (), [next ()], binary (), opt ()) -> decode_result ().
169
176
array (<<$] , Bin /binary >>, Nexts , Buf , Opt ) ->
170
177
next (Bin , [], Nexts , Buf , Opt );
@@ -173,6 +180,7 @@ array(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
173
180
array (<<Bin /binary >>, Nexts , Buf , Opt ) ->
174
181
value (Bin , [{array_next , []} | Nexts ], Buf , Opt ).
175
182
183
+
176
184
- spec array_next (binary (), [jsone :json_value ()], [next ()], binary (), opt ()) -> decode_result ().
177
185
array_next (<<$] , Bin /binary >>, Values , Nexts , Buf , Opt ) ->
178
186
next (Bin , lists :reverse (Values ), Nexts , Buf , Opt );
@@ -183,6 +191,7 @@ array_next(<<>>, Values, Nexts, Buf, Opt) when Opt?OPT.stream ->
183
191
array_next (Bin , Values , Nexts , Buf , Opt ) ->
184
192
? ERROR (array_next , [Bin , Values , Nexts , Buf , Opt ]).
185
193
194
+
186
195
- spec object (binary (), [next ()], binary (), opt ()) -> decode_result ().
187
196
object (<<$} , Bin /binary >>, Nexts , Buf , Opt ) ->
188
197
next (Bin , make_object ([], Opt ), Nexts , Buf , Opt );
@@ -191,6 +200,7 @@ object(<<>>, Nexts, Buf, Opt) when Opt?OPT.stream ->
191
200
object (<<Bin /binary >>, Nexts , Buf , Opt ) ->
192
201
object_key (Bin , [], Nexts , Buf , Opt ).
193
202
203
+
194
204
- spec object_key (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
195
205
object_key (<<$" , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
196
206
string (Bin , byte_size (Buf ), [{object_value , Members } | Nexts ], Buf , Opt );
@@ -199,6 +209,7 @@ object_key(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
199
209
object_key (<<Bin /binary >>, Members , Nexts , Buf , Opt ) ->
200
210
? ERROR (object_key , [Bin , Members , Nexts , Buf , Opt ]).
201
211
212
+
202
213
- spec object_value (binary (), jsone :json_string (), jsone :json_object_members (), [next ()], binary (), opt ()) ->
203
214
decode_result ().
204
215
object_value (<<$: , Bin /binary >>, Key , Members , Nexts , Buf , Opt ) ->
@@ -209,6 +220,8 @@ object_value(Bin, Key, Members, Nexts, Buf, Opt) ->
209
220
? ERROR (object_value , [Bin , Key , Members , Nexts , Buf , Opt ]).
210
221
211
222
- compile ({inline , [object_key / 2 ]}).
223
+
224
+
212
225
object_key (Key , ? OPT {keys = binary }) ->
213
226
Key ;
214
227
object_key (Key , ? OPT {keys = atom }) ->
@@ -223,6 +236,7 @@ object_key(Key, ?OPT{keys = attempt_atom}) ->
223
236
Key
224
237
end .
225
238
239
+
226
240
- spec object_next (binary (), jsone :json_object_members (), [next ()], binary (), opt ()) -> decode_result ().
227
241
object_next (<<$} , Bin /binary >>, Members , Nexts , Buf , Opt ) ->
228
242
next (Bin , make_object (Members , Opt ), Nexts , Buf , Opt );
@@ -233,10 +247,12 @@ object_next(<<>>, Members, Nexts, Buf, Opt) when Opt?OPT.stream ->
233
247
object_next (Bin , Members , Nexts , Buf , Opt ) ->
234
248
? ERROR (object_next , [Bin , Members , Nexts , Buf , Opt ]).
235
249
250
+
236
251
- spec string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
237
252
string (<<Bin /binary >>, Start , Nexts , Buf , Opt ) ->
238
253
string (Bin , Bin , Start , Nexts , Buf , Opt ).
239
254
255
+
240
256
- spec string (binary (), binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
241
257
string (<<$" , Bin /binary >>, Base , Start , Nexts , Buf , Opt ) ->
242
258
Prefix = binary :part (Base , 0 , byte_size (Base ) - byte_size (Bin ) - 1 ),
@@ -293,6 +309,7 @@ string(<<>>, Base, Start, Nexts, Buf, Opt) when Opt?OPT.stream ->
293
309
string (Bin , Base , Start , Nexts , Buf , Opt ) ->
294
310
? ERROR (string , [Bin , Base , Start , Nexts , Buf , Opt ]).
295
311
312
+
296
313
- spec unicode_string (binary (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
297
314
unicode_string (<<N :4 /binary , Bin /binary >> = Bin0 , Start , Nexts , Buf , Opt ) ->
298
315
try
@@ -337,12 +354,14 @@ unicode_string(Bin, Start, Nexts, Buf, Opt) when byte_size(Bin) < 4, Opt?OPT.str
337
354
unicode_string (Bin , Start , Nexts , Buf , Opt ) ->
338
355
? ERROR (unicode_string , [Bin , Start , Nexts , Buf , Opt ]).
339
356
357
+
340
358
- spec number (binary (), [next ()], binary (), opt ()) -> decode_result ().
341
359
number (<<$- , Bin /binary >>, Nexts , Buf , Opt ) ->
342
360
number_integer_part (Bin , - 1 , Nexts , Buf , Opt );
343
361
number (<<Bin /binary >>, Nexts , Buf , Opt ) ->
344
362
number_integer_part (Bin , 1 , Nexts , Buf , Opt ).
345
363
364
+
346
365
- spec number_integer_part (binary (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
347
366
number_integer_part (<<$0 >>, Sign , Nexts , Buf , Opt ) when Opt ? OPT .stream ->
348
367
incomplete (fun number_fraction_part /6 , [<<>>, Sign , 0 , Nexts , Buf , Opt ]);
@@ -355,6 +374,7 @@ number_integer_part(<<>>, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
355
374
number_integer_part (Bin , Sign , Nexts , Buf , Opt ) ->
356
375
? ERROR (number_integer_part , [Bin , Sign , Nexts , Buf , Opt ]).
357
376
377
+
358
378
- spec number_integer_part_rest (binary (), non_neg_integer (), 1 | - 1 , [next ()], binary (), opt ()) -> decode_result ().
359
379
number_integer_part_rest (<<C , Bin /binary >>, N , Sign , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
360
380
number_integer_part_rest (Bin , N * 10 + C - $0 , Sign , Nexts , Buf , Opt );
@@ -363,12 +383,14 @@ number_integer_part_rest(<<>>, N, Sign, Nexts, Buf, Opt) when Opt?OPT.stream ->
363
383
number_integer_part_rest (<<Bin /binary >>, N , Sign , Nexts , Buf , Opt ) ->
364
384
number_fraction_part (Bin , Sign , N , Nexts , Buf , Opt ).
365
385
386
+
366
387
- spec number_fraction_part (binary (), 1 | - 1 , non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
367
388
number_fraction_part (<<$. , Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
368
389
number_fraction_part_rest (Bin , Sign , Int , 0 , Nexts , Buf , Opt );
369
390
number_fraction_part (<<Bin /binary >>, Sign , Int , Nexts , Buf , Opt ) ->
370
391
number_exponation_part (Bin , Sign * Int , 0 , Nexts , Buf , Opt ).
371
392
393
+
372
394
- spec number_fraction_part_rest (binary (), 1 | - 1 , non_neg_integer (), non_neg_integer (), [next ()], binary (), opt ()) ->
373
395
decode_result ().
374
396
number_fraction_part_rest (<<C , Bin /binary >>, Sign , N , DecimalOffset , Nexts , Buf , Opt ) when $0 =< C , C =< $9 ->
@@ -380,6 +402,7 @@ number_fraction_part_rest(<<Bin/binary>>, Sign, N, DecimalOffset, Nexts, Buf, Op
380
402
number_fraction_part_rest (Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ) ->
381
403
? ERROR (number_fraction_part_rest , [Bin , Sign , N , DecimalOffset , Nexts , Buf , Opt ]).
382
404
405
+
383
406
- spec number_exponation_part (binary (), integer (), non_neg_integer (), [next ()], binary (), opt ()) -> decode_result ().
384
407
number_exponation_part (<<$e , $+ , Bin /binary >>, N , DecimalOffset , Nexts , Buf , Opt ) ->
385
408
number_exponation_part (Bin , N , DecimalOffset , 1 , 0 , true , Nexts , Buf , Opt );
@@ -406,6 +429,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, Nexts, Buf, Opt) ->
406
429
next (Bin , N / math :pow (10 , DecimalOffset ), Nexts , Buf , Opt )
407
430
end .
408
431
432
+
409
433
- spec number_exponation_part (binary (),
410
434
integer (),
411
435
non_neg_integer (),
@@ -438,6 +462,7 @@ number_exponation_part(<<Bin/binary>>, N, DecimalOffset, ExpSign, Exp, false, Ne
438
462
number_exponation_part (Bin , N , DecimalOffset , ExpSign , Exp , IsFirst , Nexts , Buf , Opt ) ->
439
463
? ERROR (number_exponation_part , [Bin , N , DecimalOffset , ExpSign , Exp , IsFirst , Nexts , Buf , Opt ]).
440
464
465
+ <<<<<<< HEAD
441
466
incomplete_result ({ok , Value , Rest } = Result ) ->
442
467
% % The user needs to call Fun(end_stream) to get the ok tuple.
443
468
{incomplete ,
@@ -485,6 +510,8 @@ incomplete_string(Remains, Base, Start, Nexts, Buf, Opt) ->
485
510
<<Base /binary , More /binary >>,
486
511
Start , Nexts , Buf , Opt ))
487
512
end }.
513
+ =======
514
+ >>>>>>> origin /master
488
515
489
516
- spec make_object (jsone :json_object_members (), opt ()) -> jsone :json_object ().
490
517
make_object (Members , ? OPT {object_format = tuple }) ->
@@ -498,10 +525,12 @@ make_object([], _) ->
498
525
make_object (Members , _ ) ->
499
526
lists :reverse (Members ).
500
527
528
+
501
529
- spec parse_options ([jsone :decode_option ()]) -> opt ().
502
530
parse_options (Options ) ->
503
531
parse_option (Options , ? OPT {}).
504
532
533
+
505
534
- spec parse_option ([jsone :decode_option ()], opt ()) -> opt ().
506
535
parse_option ([], Opt ) ->
507
536
Opt ;
0 commit comments