123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- -module(jsone).
- -export([
- decode/1, decode/2,
- try_decode/1, try_decode/2,
- encode/1, encode/2,
- try_encode/1, try_encode/2
- ]).
- -export_type([
- json_value/0,
- json_boolean/0,
- json_number/0,
- json_string/0,
- json_array/0,
- json_object/0,
- json_object_members/0,
- json_term/0,
- json_object_format_tuple/0,
- json_object_format_proplist/0,
- json_object_format_map/0,
- json_scalar/0,
- encode_option/0,
- decode_option/0,
- float_format_option/0,
- datetime_encode_format/0, datetime_format/0,
- timezone/0, utc_offset_seconds/0
- ]).
- -type json_value() :: json_number() | json_string() | json_array() | json_object() | json_boolean() | null | json_term().
- -type json_boolean() :: boolean().
- -type json_number() :: number().
- -type json_string() :: binary() | atom() | calendar:datetime().
- -type json_array() :: [json_value()].
- -type json_object() :: json_object_format_tuple()
- | json_object_format_proplist()
- | json_object_format_map().
- -type json_object_members() :: [{json_string(), json_value()}].
- -type json_term() :: {json, iolist()} | {json_utf8, unicode:chardata()}.
- -type json_object_format_tuple() :: {json_object_members()}.
- -type json_object_format_proplist() :: [{}] | json_object_members().
- -ifdef('NO_MAP_TYPE').
- -opaque json_object_format_map() :: json_object_format_proplist().
- -else.
- -type json_object_format_map() :: map().
- -endif.
- -type json_scalar() :: json_boolean() | json_number() | json_string().
- -type float_format_option() :: {scientific, Decimals :: 0..249}
- | {decimals, Decimals :: 0..253}
- | compact.
- -type datetime_encode_format() :: Format::datetime_format()
- | {Format::datetime_format(), TimeZone::timezone()}.
- -type datetime_format() :: iso8601.
- -type timezone() :: utc | local | utc_offset_seconds().
- -type utc_offset_seconds() :: -86399..86399.
- -type encode_option() :: native_utf8
- | {float_format, [float_format_option()]}
- | {datetime_format, datetime_encode_format()}
- | {object_key_type, string | scalar | value}
- | {space, non_neg_integer()}
- | {indent, non_neg_integer()}.
- -type decode_option() :: {object_format, tuple | proplist | map}
- | {allow_ctrl_chars, boolean()}.
- -spec decode(binary()) -> json_value().
- decode(Json) ->
- decode(Json, []).
- -spec decode(binary(), [decode_option()]) -> json_value().
- decode(Json, Options) ->
- try
- {ok, Value, _} = try_decode(Json, Options),
- Value
- catch
- error:{badmatch, {error, {Reason, [StackItem]}}} ->
- erlang:raise(error, Reason, [StackItem | erlang:get_stacktrace()])
- end.
- -spec try_decode(binary()) -> {ok, json_value(), Remainings::binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
- try_decode(Json) ->
- try_decode(Json, []).
- -spec try_decode(binary(), [decode_option()]) -> {ok, json_value(), Remainings::binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
- try_decode(Json, Options) ->
- jsone_decode:decode(Json, Options).
- -spec encode(json_value()) -> binary().
- encode(JsonValue) ->
- encode(JsonValue, []).
- -spec encode(json_value(), [encode_option()]) -> binary().
- encode(JsonValue, Options) ->
- try
- {ok, Binary} = try_encode(JsonValue, Options),
- Binary
- catch
- error:{badmatch, {error, {Reason, [StackItem]}}} ->
- erlang:raise(error, Reason, [StackItem | erlang:get_stacktrace()])
- end.
- -spec try_encode(json_value()) -> {ok, binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
- try_encode(JsonValue) ->
- try_encode(JsonValue, []).
- -spec try_encode(json_value(), [encode_option()]) -> {ok, binary()} | {error, {Reason::term(), [erlang:stack_item()]}}.
- try_encode(JsonValue, Options) ->
- jsone_encode:encode(JsonValue, Options).
|