Разбор строки JSON до целого числа в эликсире - PullRequest
0 голосов
/ 01 мая 2018

Я имею дело с JSON API, который возвращает число в виде строки. Например, "12", однако это значение поля также может быть не числовым, например: "-".

Я проанализировал данные JSON на карте и хочу извлечь это поле как целое число в эликсире, а затем выполнить некоторую операцию в зависимости от того, где целое число попадает в определенный диапазон.

Кажется, есть несколько способов сделать это, два основных из которых Integer.parse/1, который возвращает кортеж или :error, и String.to_integer/1, который возвращает целое число или вызывает исключение.

Каков наилучший способ выполнения какой-либо операции в зависимости от того, где числовое значение, содержащееся в строке, попадает в определенный диапазон, с соответствующей обработкой ошибок синтаксического анализа?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Если ожидается, что значение может быть не целым числом (при нормальных, не исключительных обстоятельствах), следует использовать 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

Создание и обработка исключения следует оставить в качестве крайней меры, и его не рекомендуется использовать для управления потоком.

0 голосов
/ 01 мая 2018

В документации для 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
...