2015-05-21 4 views
3

Я хочу разобрать строку в Elixir. Очевидно, он двоичный. Я хочу получить значение left_operand, это «2», но я не уверен, как это сделать. Потому что это как строка, список, кортеж.Строка parse в Elixir

iex(13)> str = "[{\"start_usage\":\"0\",\"left_operand\":\"2\"}]" 
iex(15)> is_binary str 
true 

Строка представляет собой формат JSON, полученный из MySQL. Я хочу использовать модуль devinus/poison для его анализа, но я не уверен, как иметь дело с первой и последней двойными кавычками (").

Кажется, что мне просто нужно кортеж часть так что я могу сделать это, как

iex(5)> s = Poison.Parser.parse!(~s({\"start_usage\":\"0\",\"left_operand\":\"2\"})) 
%{"left_operand" => "2", "start_usage" => "0"} 
iex(6)> s["left_operand"] 
"2" 

Но я не знаю, как получить кортеж часть.

Заранее спасибо

EDIT:

Я думаю, что я понял, как сделать это мой путь.

iex> iex(4)> [s] = Poison.Parser.parse!("[{\"start_usage\":\"0\",\"left_operand\":\"2\"}]") 
[%{"left_operand" => "2", "start_usage" => "0"}] 
iex(5)> s 
%{"left_operand" => "2", "start_usage" => "0"} 
iex(6)> s["left_operand"] 
"2" 

Я не знаю, почему это работает, я не прошел ~s префикс

ответ

3

Кортеж часть, которую вы ищете на самом деле map.

Причина, по которой ваша оригинальная версия не работает, заключается в том, что ваш JSON при декодировании вернул карту в качестве первого элемента list.

Существует несколько способов получить первый элемент списка.

Вы можете использовать hd функцию:

iex(2)> s = [%{"left_operand" => "2", "start_usage" => "0"}] 
[%{"left_operand" => "2", "start_usage" => "0"}] 
iex(3)> hd s 
%{"left_operand" => "2", "start_usage" => "0"} 

Или вы можете шаблон матча:

iex(4)> [s | _] = [%{"left_operand" => "2", "start_usage" => "0"}] 
[%{"left_operand" => "2", "start_usage" => "0"}] 
iex(5)> s 
%{"left_operand" => "2", "start_usage" => "0"} 

Здесь destructuring используется для разделения списка на элементы головы и хвоста (хвост игнорируется, почему используется _)

Это не имеет никакого отношения к типу элементов внутри списка. Если вам нужны первые 3 элемента списка, вы можете сделать:

iex(6)> [a, b, c | tail] = ["a string", %{}, 1, 5, ?s, []] 
["a string", %{}, 1, 5, 115, []] 
iex(7)> a 
"a string" 
iex(8)> b 
%{} 
iex(9)> c 
1 
iex(10)> tail 
[5, 115, []] 
1

При разбора JSON строку с ядом, нет никакого способа для того, чтобы знать, если значения внутри команды Объект JSON является целым числом или чем-то другим, кроме строки. Чтобы получить номер 2, вы можете сделать:

~s({"start_usage":"0","left_operand":"2"}) 
|> Poison.Parser.parse! 
|> Map.get("left_operand") 
|> String.to_integer()