Deep clone and merge JSON::Any trees
Crystal
require "json"
def deep_clone(value : JSON::Any) : JSON::Any
case raw = value.raw
when Hash
JSON::Any.new(raw.transform_values { |v| deep_clone(v) })
when Array
JSON::Any.new(raw.map { |v| deep_clone(v) })
else
value
end
end
def deep_merge(base : JSON::Any, patch : JSON::Any) : JSON::Any
bh, ph = base.as_h?, patch.as_h?
return deep_clone(patch) unless bh && ph
merged = bh.dup
ph.each { |key, value| merged[key] = merged.has_key?(key) ? deep_merge(merged[key], value) : deep_clone(value) }
JSON::Any.new(merged)
end