json = """
[
{
"k1": "v1",
"k2": {
"k21": "v21",
"k22": "v22"
}
},
{
"k4": "v4",
"k5": "v5",
"k6": "v6"
}
]
"""
_expected_result = """
[
{
"k1": "k1",
"k2": {
"k21": "k2.k21",
"k22": "k2.k22"
}
},
{
"k4": "k4",
"k5": "k5",
"k6": "k6"
}
]
"""
defmodule Solution do
def run(json_str, encode_opts \\ []) do
with {:ok, data} <- Jason.decode(json_str) do
data
|> process()
|> Jason.encode(encode_opts)
end
end
def run!(json_str, encode_opts \\ []) do
json_str
|> Jason.decode!()
|> process()
|> Jason.encode!(encode_opts)
end
def process(data), do: process_item(data, "")
# 处理数组
defp process_item(data, value_prefix) when is_list(data) do
Enum.map(data, &process_item(&1, value_prefix))
end
# 处理对象
defp process_item(%{} = data, value_prefix) do
Map.new(data, fn {k, v} -> {k, process_item(v, build_value_prefix(value_prefix, k))} end)
end
# 处理值
defp process_item(_data, value_prefix), do: value_prefix
defp build_value_prefix("", current_key), do: current_key
defp build_value_prefix(previous_prefix, current_key), do: previous_prefix <> "." <> current_key
end
Solution.run!(json, pretty: true)
|> IO.puts()