2016-12-12 2 views
0

Будучи новым для Elixir и функциональным программированием У меня возникают некоторые проблемы с получением «вкусового» ключа из этой структуры.Эликсир, получающий ключ/значение от json/struct

json = response.body 
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]}) 

Returns: 
[%{"items" => [%MyModule.Icecream{size: "Large", 
taste: "Pistachio"}]}] 

Я хотел бы только получить вкус («Фисташки») сохраняется в переменной наиболее оптимизированными образом.

Я с нетерпением жду просветления. :)

Решение: Я придумал это сам:

taste = List.first(icecream["items"]).taste 
+0

Подход, который вы должны выбрать, будет зависеть от того, как вы хотите кромки. Что вы хотите, когда элемент отсутствует (если вы хотите обработать этот случай)? Вы предпочли бы, чтобы он возбуждал исключение или возвращал нуль? Что-то другое? –

+0

Я ожидаю, что он всегда будет там, но я согласен с тем, что было бы лучше проверить его. – Zahrec

ответ

2

Использование труб, вы можете сделать

icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste) 

Однако, я предлагаю вам использовать get_in/2 в сочетании с Access helpers, что ИМО дает очень читаемый код и кажется более приятным для более сложных случаев.

import Access 
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)] 
+0

Спасибо за ваш ответ. Я получаю ошибку компилятора во втором решении: undefined function at/1 – Zahrec

+0

Вы «импортировали Access»? Вы также можете сделать это локально для одной функции, если вы обеспокоены загромождением своего пространства имен. –

+1

@PatrickOscity Это доступно только в определенных версиях Elixir? Возможно, Захрек работает со старой версией Elixir? –

0

Вы также можете использовать простой поиск по шаблону:

[%{"items" => [%{taste: taste_val}]}] = your_result 

Это экономит taste значения в переменную taste_val. Если ваш результат не имеет taste, он будет установлен в nil (или ваше значение по умолчанию), поскольку вы используете модуль с defstruct, где вы определяете структуру.

0

Вы можете также использовать Map.get или Map.fetch См: https://hexdocs.pm/elixir/Map.html#fetch/2)

Имейте в виду, если вы используете

Map.fetch!(map,key)

вы можете вызвать побочный эффект (ошибка выброшен), когда ключ нет в map. Если вы используете Map.fetch(map,key), вы получите обратно кортеж с ok или error статус, обозначающий наличие key в map.

Смежные вопросы