Parsing 在Elixir中将JSON字符串解析为整数

Parsing 在Elixir中将JSON字符串解析为整数,parsing,error-handling,elixir,Parsing,Error Handling,Elixir,我正在处理一个以字符串形式返回数字的JSON API。例如“12”,但是,此字段值也可以是非数字的,例如:“-” 我已经将JSON数据解析为一个映射,我想在elixir中将此字段提取为一个整数,然后根据整数在某个范围内的位置执行一些操作 似乎有多种方法可以实现这一点,其中两种主要方法是返回元组或:error,即Integer.parse/1,以及返回整数或引发异常的String.to\u Integer/1 根据字符串中包含的数值在某个范围内的位置执行某些操作的最佳方法是什么,以适当地处理解析错

我正在处理一个以字符串形式返回数字的JSON API。例如
“12”
,但是,此字段值也可以是非数字的,例如:
“-”

我已经将JSON数据解析为一个映射,我想在elixir中将此字段提取为一个整数,然后根据整数在某个范围内的位置执行一些操作

似乎有多种方法可以实现这一点,其中两种主要方法是返回元组或
:error
,即
Integer.parse/1
,以及返回整数或引发异常的
String.to\u Integer/1


根据字符串中包含的数值在某个范围内的位置执行某些操作的最佳方法是什么,以适当地处理解析错误?

Integer.parse的文档说使用
string.to_Integer
进行此操作,因此最好遵循以下准则:

如果要将字符串格式的整数直接转换为 可以使用整数、
String.to_integer/1
String.to_integer/2
相反

但是,如果无法解析字符串,
String.to_integer
将引发错误。可以捕获错误案例并将其分配给
nil
,然后匹配结果模式:

integer_value =
  try do
    String.to_integer(string_value_from_json)
  rescue
    _ -> nil
  end

analysis =
  case integer_value do
    nil -> "integer could not be parsed"
    integer_value when integer_value in 1..10 -> "integer #{integer_value} between 1 and 10"
    integer_value when integer_value in 11..20 -> "integer #{integer_value} is between 11 and 20"
    integer_value -> "integer #{integer_value} was out of range"
  end

IO.puts analysis

如果期望值不能是整数(在正常情况下,而非例外情况下),则应使用:


抛出和处理异常应作为最后手段,不鼓励用于控制流。

文档中没有说明使用
字符串。对于_integer
,它说“可以使用”,在这种特殊情况下,这是错误的。抛出和处理异常应该作为最后的手段。如果您希望值有时不是整数,则应使用
integer.parse
。我知道,我最初希望使用integer.parse,但它的文档说服了我。我想我认为这种情况下的特殊情况应该是一个决定因素。
analysis =
  case Integer.parse(string_value_from_json) do
    {i, ""} when i in 1..10 ->
      "integer #{i} between 1 and 10"
    {i, ""} when i in 11..20 ->
      "integer #{i} is between 11 and 20"
    {i, ""} ->
      "integer #{i} was out of range"
    _ -> "integer could not be parsed"
  end