Изменение JSON — легко или сложно?

В своей работе вам наверняка приходится сталкиваться с множеством технических проблем. Некоторые из них отнимают много времени, другие решаются быстро. Иногда вы сталкиваетесь с очень хорошо понятными и потенциально легко решаемыми проблемами… но в итоге вы видите, что потратили уйму часов на поиск решения, которое должно было занять меньше часа.

Итак… как насчет модификации JSON? Легко или сложно это сделать в Ruby (& Rails)?

Предположим, что у нас есть простая структура с HTML-фрагментами внутри:

{
  "a": {
    "b": [
      {
        "c": "<span id="head"></span>"
      },
      {
        "d": "<span id="body"></span>"
      }
    ],
    "e": "#ffffff"
  },
  "f": "<span id="footer"></span>",
  "g": 123
}
Войти в полноэкранный режим Выход из полноэкранного режима

и у нас есть список переменных, например:

head = "Hey John!"
body = "I invite you to my Birthday party!"
footer = "Best regards."
Enter fullscreen mode Выход из полноэкранного режима

Наша цель — найти определенные фрагменты DOM в этом дереве и внедрить текст. Другие значения не могут быть изменены. Поэтому в конце мы получим что-то вроде этого.

{
  "a": {
    "b": [
      {
        "c": "<span id="head">Hey John!</span>"
      },
      {
        "d": "<span id="body">I invite you to my Birthday party!</span>"
      }
    ],
    "e": "#ffffff"
  },
  "f": "<span id="footer">Best regards.</span>",
  "g": 123
}
Войти в полноэкранный режим Выход из полноэкранного режима

Похоже, что решение довольно простое. Вы можете преобразовать его в хэш и использовать метод deep_transform_values в сочетании с гемом nokogiri.

hash.deep_transform_values { |value|
  if value.is_a?(String)
    html = Nokogiri::HTML5.fragment(value)

    head_node = html.at_css("#head")
    body_node = html.at_css("#body")
    footer_node = html.at_css("#footer")

    head_node&.inner_html = head
    body_node&.inner_html = body
    footer_node&.inner_html = footer

    html.to_s
  else
    value
  end
}
Вход в полноэкранный режим Выйти из полноэкранного режима

… и это все.

Оцените статью
devanswers.ru
Добавить комментарий