Packages
jsv
0.4.0
0.21.2
0.21.1
0.21.0
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.5
0.11.4
0.11.3
retired
0.11.2
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
A JSON Schema Validator with complete support for the latest specifications.
Current section
Files
Jump to
Current section
Files
lib/jsv/codec.ex
defmodule JSV.Codec do
@moduledoc """
JSON encoder/decoder based on available implementation.
"""
@doc false
@spec codec :: module
def codec
cond do
Code.ensure_loaded?(JSON) ->
def codec do
JSON
end
defp do_decode(json) do
JSON.decode(json)
end
defp do_decode!(json) do
JSON.decode!(json)
end
defp do_encode!(data) do
JSON.encode!(data)
end
if Code.ensure_loaded?(:json) do
defp do_format!(data) do
data |> :json.format() |> :erlang.iolist_to_binary()
end
else
defp do_format!(data) do
Jason.encode!(data, pretty: true)
end
end
Code.ensure_loaded?(Poison) ->
def codec do
Poison
end
defp do_decode(json) do
Poison.decode(json)
end
defp do_decode!(json) do
Poison.decode!(json)
end
defp do_encode!(data) do
Poison.encode!(data)
end
defp do_format!(data) do
Poison.encode!(data, pretty: true)
end
Code.ensure_loaded(Jason) ->
def codec do
Jason
end
defp do_decode(json) do
Jason.decode(json)
end
defp do_decode!(json) do
Jason.decode!(json)
end
defp do_encode!(data) do
Jason.encode!(data)
end
defp do_format!(data) do
Jason.encode!(data, pretty: true)
end
true ->
# TODO this could be a runtime error, if library users do not use the
# resolver at all, there is no need to require a codec.
raise "could not define JSON codec for #{inspect(__MODULE__)}\n\n" <>
"For Elixir versions lower than 1.18, make sure to declare a JSON parser " <>
~S|dependency such as {:jason, "~> 1.0"}, {:poison, "~> 5.0"} or | <>
~S|{:poison, "~> 6.0"}.|
end
@doc "Equivalent to `JSON.decode/1`."
@spec decode(binary) :: {:ok, term} | {:error, term}
def decode(json) when is_binary(json) do
do_decode(json)
end
@doc "Equivalent to `JSON.decode!/1`."
@spec decode!(binary) :: term
def decode!(json) when is_binary(json) do
do_decode!(json)
end
@doc "Equivalent to `JSON.encode!/1`."
@spec encode!(term) :: binary
def encode!(term) do
do_encode!(term)
end
@doc false
# This is only useful for the test suite.
@spec format!(term) :: binary
def format!(term) do
do_format!(term)
end
end