string - 在 Elixir 中解析字符串

标签 string 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 前缀

最佳答案

您要查找的元组部分实际上是一个 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, []] 

关于string - 在 Elixir 中解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30363153/

相关文章:

c# - 将许多变量从 Unity 发送到 Arduino

regex - 如何在 MATLAB 中使用正则表达式删除路径(字符串)的结尾部分?

string - 将Scheme表达式转换为字符串

ios - swift : boundingRectWithSize return wrong height for a multiline label

elixir - 如何减少 Elixir 中的 map 列表

elixir - 如何在 Elixir 中流式传输到文件中?

java - 如何计算字符串中的对数

list - 为什么 Elixir 在标准库中有这么多类似的列表类型?

memory-management - 解决大型二进制文件泄漏

elixir - 无法识别 2 个字段上的 unique_constraint