你好,我有这个结构
request = %Model{
id: 4_269_615,
site_id: 3,
user_id: 183_317,
program_id: 174,
type: %ProgramType{
value: :CASHBACK_PROGRAM,
__unknown_fields__: []
},
type_data: %ProgressProgramUser{
id: 1_336_676,
valid_stake: nil,
level: nil,
theo_ggr: nil,
__unknown_fields__: []
},
start_at: ~U[2024-09-05 13:27:20.391727Z],
end_at: nil,
inserted_at: ~U[2024-09-05 13:27:24.152602Z],
program_name: "test cb program 20 min GOLD NFT",
__unknown_fields__: []
}
我正在尝试__unknown_fields__: []
从结构以及嵌套结构中删除。
我正在使用的代码正在运行
def drop_unknown_fields(struct) when is_struct(struct) do
struct
|> Map.from_struct()
|> drop_unknown_fields()
end
def drop_unknown_fields(%{} = map) when is_map(map) do
map
|> Enum.reduce(%{}, fn {key, value}, acc ->
updated_value =
case date?(value) do
true -> value
false -> drop_unknown_fields(value)
end
Map.put(acc, key, updated_value)
end)
|> Map.delete(:__unknown_fields__)
end
def drop_unknown_fields(value), do: value
def date?(%DateTime{}), do: true
def date?(%Date{}), do: true
def date?(%NaiveDateTime{}), do: true
def date?(_), do: false
但我认为这不是正确的做法。检查日期的原因是:当我尝试执行嵌套结构时,数据时间也是一个结构,它会被解析为一个映射,而这并不是必需的。所以你能指导我一些清理这个结构并删除的最佳方法吗?:__unknown_fields__
谢谢
更新:我用下面的代码重构了它,但仍在寻找建议。
def drop_unknown_fields(struct) when is_struct(struct) do
struct
|> Map.from_struct()
|> only_consider_unknown_fields(struct)
|> drop_unknown_fields()
end
def drop_unknown_fields(%{} = map) when is_map(map) do
map
|> Enum.reduce(%{}, fn {key, value}, acc ->
updated_value = drop_unknown_fields(value)
Map.put(acc, key, updated_value)
end)
|> Map.delete(:__unknown_fields__)
end
def drop_unknown_fields({:consider, map}), do: drop_unknown_fields(map)
def drop_unknown_fields({:ignore, struct}), do: struct
def drop_unknown_fields(value), do: value
defp only_consider_unknown_fields(map, struct) do
case Map.has_key?(map, :__unknown_fields__) do
true -> {:consider, map}
false -> {:ignore, struct}
end
end
这是我认为可以按照您想要的方式工作的实现。
具有特定键的结构将转换为映射,删除该特定键,并递归处理它们的值。
其它结构保持原样。
然后,非结构映射的值将被处理并转换回映射。
任何其他值均保持原样。
输出:
完整代码: