сравнить объект со схемой json и заполнить его значениями схемы по умолчанию, если они не установлены - PullRequest
0 голосов
/ 03 февраля 2020

Я использую Ruby JSON Валидатор схемы для проверки некоторых из моих входных данных, что довольно неплохо.

Но я хотел бы обновить свои входные данные так что он принимает значения схемы по умолчанию, если ее значения не установлены.

  input = {'url' => 'http://www.google.com'}

  schema = {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
      },
      "infos":{
        "type": "object",
        "properties": {
          "content_type": {
            "type": "string",
            "default": "html",
          },
        }
      }
    }
  }

  #make some magic here to update my input with the schema

  output = {
      'url' => 'http://www.google.com',
      'infos' => {'content_type'=>'html'}
  }

Как я могу этого достичь, зная, что структура входных данных не совпадает со структурой схемы?

Существует опция : insert_defaults с Ruby JSON Валидатором схемы , но я не вижу способа получить заполненный объект. Кажется, код, связанный с этим, здесь .

Я также искал в Google, сделал несколько попыток с deep_merge () , но поскольку сравниваемые структуры я не знаю, как с этим справиться.

1 Ответ

0 голосов
/ 08 февраля 2020

Вот что я придумал:

def defaultsFromSchema(node,nodekeys=[],datas={})
  return unless node.is_a?(Hash)

  if node.has_key?('default')
    value = node['default']
    #create hash and set deep keys
    return nodekeys.reverse.inject(value) { |a, n| { n => a } }

  else
    node.each do |k, v|
      keys = nodekeys.clone
      if k != 'properties'
        keys.push(k)
      end

      append = defaultsFromSchema(v,keys,datas)
      if append
        datas = datas.deep_merge(append)
      end

    end
  end

  datas

end
...