defmodule Poison do alias Poison.Encoder alias Poison.Decode alias Poison.Parser @doc """ Encode a value to JSON. iex> Poison.encode([1, 2, 3]) {:ok, "[1,2,3]"} iex> Poison.encode([1, 2, 3], iodata: true) {:ok, [91, "1", [44, "2", 44, "3"], 93]} """ @spec encode(Encoder.t, Keyword.t) :: {:ok, iodata} | {:ok, String.t} | {:error, {:invalid, any}} def encode(value, options \\ []) do {:ok, encode!(value, options)} rescue exception in [Poison.EncodeError] -> {:error, {:invalid, exception.value}} end @doc """ Encode a value to JSON, raises an exception on error. iex> Poison.encode!([1, 2, 3]) "[1,2,3]" iex> Poison.encode!([1, 2, 3], iodata: true) [91, "1", [44, "2", 44, "3"], 93] """ @spec encode!(Encoder.t, Keyword.t) :: iodata | no_return def encode!(value, options \\ []) do iodata = Encoder.encode(value, options) unless options[:iodata] do iodata |> IO.iodata_to_binary else iodata end end @doc """ Decode JSON to a value. iex> Poison.decode("[1,2,3]") {:ok, [1, 2, 3]} """ @spec decode(iodata, Keyword.t) :: {:ok, Parser.t} | {:error, :invalid} | {:error, {:invalid, String.t}} def decode(iodata, options \\ []) do case Parser.parse(iodata, options) do {:ok, value} -> {:ok, Decode.decode(value, options)} error -> error end end @doc """ Decode JSON to a value, raises an exception on error. iex> Poison.decode!("[1,2,3]") [1, 2, 3] """ @spec decode!(iodata, Keyword.t) :: Parser.t | no_return def decode!(iodata, options \\ []) do Decode.decode(Parser.parse!(iodata, options), options) end end