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

时间:2018-05-01 07:16:11

标签: parsing error-handling elixir

我正在处理一个JSON API,它将一个数字作为字符串返回。但是,例如"12",此字段值也可以是非数字值,例如:"-"

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

似乎有多种方法可以实现这两个主要方法Integer.parse/1,它返回一个元组或:errorString.to_integer/1,它返回整数或引发异常。

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

2 个答案:

答案 0 :(得分:2)

如果人们期望该值不是整数(在正常情况下,非特殊情况下),则应使用Integer.parse/2

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

抛弃和处理异常应该留作最后的手段,不鼓励用来控制流量。

答案 1 :(得分:-1)

Integer.parse的文档说明为此目的使用String.to_integer,因此最好遵循指南:

  

如果要将字符串格式的整数直接转换为a   可以使用整数,String.to_integer/1String.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