在 Elixir 中解析字符串
Parse string in Elixir
我想在 Elixir 中解析一个字符串。它显然是二进制的。
我想获取 left_operand
的值,它是 '2',但我不知道该怎么做。因为它就像字符串、列表、元组的混合体。
iex(13)> str = "[{\"start_usage\":\"0\",\"left_operand\":\"2\"}]"
iex(15)> is_binary str
true
字符串是从 MySQL 检索到的 JSON 格式。
我想使用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"
但是我不知道如何获取元组部分。
提前致谢
编辑:
我想我知道如何按照自己的方式去做了。
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
前缀
当您使用 Poison 解析 JSON 字符串时,它无法知道 JSON 对象中的值是整数还是字符串以外的其他值。要获取号码 2
,您可以这样做:
~s({"start_usage":"0","left_operand":"2"})
|> Poison.Parser.parse!
|> Map.get("left_operand")
|> String.to_integer()
您要查找的元组部分实际上是 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, []]
我想在 Elixir 中解析一个字符串。它显然是二进制的。
我想获取 left_operand
的值,它是 '2',但我不知道该怎么做。因为它就像字符串、列表、元组的混合体。
iex(13)> str = "[{\"start_usage\":\"0\",\"left_operand\":\"2\"}]"
iex(15)> is_binary str
true
字符串是从 MySQL 检索到的 JSON 格式。
我想使用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"
但是我不知道如何获取元组部分。
提前致谢
编辑:
我想我知道如何按照自己的方式去做了。
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
前缀
当您使用 Poison 解析 JSON 字符串时,它无法知道 JSON 对象中的值是整数还是字符串以外的其他值。要获取号码 2
,您可以这样做:
~s({"start_usage":"0","left_operand":"2"})
|> Poison.Parser.parse!
|> Map.get("left_operand")
|> String.to_integer()
您要查找的元组部分实际上是 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, []]