【问题标题】:Parsing a JSON string to an integer in Elixir在 Elixir 中将 JSON 字符串解析为整数
【发布时间】:2018-05-01 15:24:28
【问题描述】:

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

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

似乎有多种方法可以做到这一点,两种主要方法是Integer.parse/1,它返回一个元组或:error,和String.to_integer/1,它返回整数或引发异常。

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

【问题讨论】:

    标签: parsing error-handling elixir


    【解决方案1】:

    如果期望值不能是整数(在正常情况下,非特殊情况下),则应使用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
    

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

    【讨论】:

      【解决方案2】:

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

      如果您想将字符串格式的整数直接转换为 整数,可以使用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
      

      【讨论】:

      • 文档没有说使用String.to_integer,它说“可以使用”,在这种特殊情况下这是错误的。抛出和处理异常应该作为最后的手段。如果您希望该值有时不是整数,则应使用Integer.parse
      • 我明白了,我最初想要 Integer.parse 但它的文档说服了我。我想我在这种情况下的特殊情况应该是一个决定性因素。
      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多