module DingSDK::MetadataFields

def marshal_json(encode: true)

def marshal_json(encode: true)
  d = {}
  fields.sort_by(&:name).each do |field|
    f = send(field.name)
    next if f.nil?
    format_json_meta = field.metadata[:format_json]
    if !format_json_meta.nil? && format_json_meta.include?(:letter_case)
      key = format_json_meta[:letter_case].call(field.name)
    else
      key = field.name
    end
    if f.is_a? Array
      d[key] = f.map { |o| marshal_single(o) }
    elsif f.is_a? Hash
      d[key] = f.map { |k, v| [k, marshal_single(v)] }
    else
      d[key] = marshal_single(f)
    end
  end
  if encode
    JSON.dump(d)
  else
    d
  end
end