Packages
claude_code
0.23.0
0.36.5
0.36.4
0.36.3
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.1
0.32.2
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Claude Agent SDK for Elixir – Build AI agents with Claude Code
Current section
Files
Jump to
Current section
Files
lib/claude_code/json_encoder.ex
defmodule ClaudeCode.JSONEncoder do
@moduledoc """
Shared JSON encoding logic for ClaudeCode structs.
Converts structs to maps with nil values removed for clean JSON output.
Used by both Jason.Encoder and JSON.Encoder protocol implementations.
"""
@doc """
Converts a struct to an encodable map, excluding nil values.
Handles nested structs, maps, and lists recursively.
## Examples
iex> block = %ClaudeCode.Content.TextBlock{type: :text, text: "hello"}
iex> ClaudeCode.JSONEncoder.to_encodable(block)
%{type: :text, text: "hello"}
iex> msg = %ClaudeCode.Message.ResultMessage{result: nil, is_error: false, ...}
iex> ClaudeCode.JSONEncoder.to_encodable(msg)
%{is_error: false, ...} # result key excluded
"""
@spec to_encodable(struct()) :: map()
def to_encodable(%{__struct__: _} = struct) do
struct
|> Map.from_struct()
|> drop_nils()
end
defp drop_nils(map) when is_map(map) do
map
|> Enum.reject(fn {_k, v} -> is_nil(v) end)
|> Map.new(fn {k, v} -> {k, process_value(v)} end)
end
defp process_value(%{__struct__: _} = struct), do: to_encodable(struct)
defp process_value(map) when is_map(map), do: drop_nils(map)
defp process_value(list) when is_list(list), do: Enum.map(list, &process_value/1)
defp process_value(other), do: other
end