# Jexon
Jexon is an Elixir library designed to provide a seamless bridge between Elixir data structures and JSON, while preserving the unique Elixir types that are not directly supported in JSON.
## Key Features
- Convert Elixir structs and maps to JSON, and vice versa, without losing data fidelity.
- Retains unique Elixir types during the conversion process.
## API
Jexon provides a simple API with three main functions:
### `to_map`
This function converts Elixir structs or maps into a map that can be serialized into JSON. This map maintains Elixir-specific types that are not directly translatable into JSON.
```elixir
# simple maps
Jexon.to_map(%{foo: 1, baz: 2, bar: 3})
%{"bar" => 3, "baz" => 2, "foo" => 1}
# with key info
Jexon.to_map(%{foo: 1, baz: 2, bar: 3}, keep_key_identity: true)
%{"__atom__:bar" => 3, "__atom__:baz" => 2, "__atom__:foo" => 1}
# structs
defmodule Foo do
defstruct ~w(foo baz bar)a
end
data = %Foo{foo: 1, baz: 2, bar: 3}
Jexon.to_json(data)
{:ok,
"{\"__atom__:__struct__\":[\"__atom__\",\"Elixir.Foo\"],\"__atom__:bar\":3,\"__atom__:baz\":2,\"__atom__:foo\":1}"}
json = ~S/
{
"__atom__:__struct__": ["__atom__", "Elixir.Foo"],
"__atom__:foo": 1,
"__atom__:baz": 2,
"__atom__:bar": 3
}
/
Jexon.from_json(json)
{:ok, %Foo{bar: 3, baz: 2, foo: 1}}
```
### `to_json`
This function converts Elixir structs or maps into a JSON string. This JSON string includes Elixir-specific types that are not directly translatable into JSON.
```elixir
dt = DateTime.utc_now()
Jexon.to_json(dt)
{:ok,
"{\"__atom__:__struct__\":[\"__atom__\",\"Elixir.DateTime\"],\"__atom__:calendar\":[\"__atom__\",\"Elixir.Calendar.ISO\"],\"__atom__:day\":8,\"__atom__:hour\":8,\"__atom__:microsecond\":[\"__tuple__\",814264,6],\"__atom__:minute\":29,\"__atom__:month\":8,\"__atom__:second\":45,\"__atom__:std_offset\":0,\"__atom__:time_zone\":\"Etc/UTC\",\"__atom__:utc_offset\":0,\"__atom__:year\":2023,\"__atom__:zone_abbr\":\"UTC\"}"}
```
### `from_json`
This function converts a JSON string, possibly including Elixir-specific types, back into an Elixir struct or map.
```elixir
json = ~S/
{
\"__atom__:__struct__\":[\"__atom__\",\"Elixir.Time\"],\"__atom__:calendar\":[\"__atom__\",\"Elixir.Calendar.ISO\"],
\"__atom__:hour\":12,
\"__atom__:microsecond\":[\"__tuple__\",0,0],\"__atom__:minute\":0,
\"__atom__:second\":0
}
/
Jexon.from_json(json)
{:ok, ~T[12:00:00]}
```
>With Jexon, you can work more effectively with JSON data in Elixir without worrying about data loss or type incompatibility issues