/ / Як створити загальний код синтаксичного аналізу JSON? - json, синтаксичний розбір, еліксир

Як створити загальний код аналізу JSON? - Джонсон, синтаксичний аналіз, еліксир

Отже, я аналізую список, що повертається шляхом синтаксичного аналізу json з jsx. Я витягаю деякі вибрані значення, шукаючи кортеж із певним ім'ям, наприклад:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

Я роблю те саме для кількох окремих елементів, які я хочу витягти, і коли я бачу багато коду, який змінюється лише за одним параметром, я відчуваю неприємний запах коду. Я маю на увазі такий код:

defp get_link([{"link",_link} | _t]), do: _link
defp get_link([_h | _t]), do: get_link(_t)
defp get_link([]), do: ""

defp get_last_updated([{"last updated",_last_updated | _t]), do: _last_updated
defp get_last_updated([_h | _t]), do: get_last_updated(_t)
defp get_last_updated([]), do: ""

defp get_creator([{"creator",_creator} | _t]), do: _creator
defp get_creator([_h | _t]), do: get_creator(_t)
defp get_creator([]), do: ""

мені пахне порушенням принципу СУХОГО.

Тож я подумав, що можу зробити щось подібне:

defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""

Але якщо припустити, що це спрацює (він компілюється, але я не впевнений, що він буде робити те, що я хочу), як мені це назвати? Я не можу зателефонувати get_json_element(["link", _link]) (або принаймні я не думаю, що можу) я маю на увазіяк правило, я передавав список, повернутий jsx.decode, різним функціям get_X, але як тоді передати вираз збігу з шаблоном? Мені шкода - я не думаю, що я дуже добре сформулював своє запитання, але я можу "t з'ясувати, як сформулювати це краще.

Це один із тих випадків, коли мені слід використовувати макрос для зменшення повторюваного коду? Якщо так, то хтось уже писав макрос такого роду?

Також цікаво, чи є кращий спосіб вказати порожній рядок. Використання "" просто не здається мені найкращим підходом. Або є інше значення, яке я міг би повернути? Може повернути нуль?

Відповіді:

2 для відповіді № 1

Ви точно можете використовувати макрос

Ви могли б використовувати https://github.com/Licenser/jsxd бібліотека для управління структурами даних, повернутими jsx

Ви можете використовувати загальну функцію типу

def get(json, key, default \ nil) do
case List.keyfind(json, key, 0, default) do
{^key, value} -> value
^default -> default
end
end

Ваше рішення

defp get_json_element([{element_to_get,value_of_element} | _t]), do: _value_of_element
defp get_json_element([_h | _t]), do: get_json_element(_t)
defp get_json_element([]), do: ""

Не працював би, тому що {element_to_get, value_of_element} відповідає будь-якому кортежу з однаковою формою {_, _}