Elixir中解析JSON返回的字符串型数字为整数的方法
嘿,针对你遇到的JSON API字段转整数的问题,我来帮你理清楚这两个方法的差异,以及怎么适配你的场景哈!
处理JSON字符串转Elixir整数的最佳实践
先搞懂两个核心方法的差异
1. String.to_integer/1
- 这个方法只认纯数字字符串,如果输入不是合法的整数格式(比如"-"、"12.3"或者"abc"),会直接抛出
ArgumentError异常。 - 举个实际使用的例子:
String.to_integer("12") # 正常返回 12 String.to_integer("-") # 直接抛出 ArgumentError - 适合你能100%确保字段是合法数字字符串的场景,但显然你的场景里存在非数值内容,直接用这个很容易触发异常崩掉。
2. Integer.parse/1
- 这个方法灵活度高很多,会尝试从字符串开头解析整数,成功的话返回
{整数, 剩余未解析的字符串},完全解析不了就返回:error。 - 实际示例:
Integer.parse("12") # 返回 {12, ""}(完全匹配数字) Integer.parse("-") # 返回 :error(无法解析成整数) Integer.parse("12abc") # 返回 {12, "abc"}(只解析开头的数字部分) - 刚好完美适配你的场景——既能处理合法的数字字符串,又能精准识别出"-"这类非数值情况。
适配你的业务场景的实现示例
既然你需要转成整数后根据区间执行操作,我们可以结合模式匹配和条件判断来写逻辑:
def handle_api_field(map) do case map["target_field"] do # 先处理明确的非数值标记 str when str in ["-", "", "N/A"] -> handle_non_numeric() # 处理普通字符串类型的字段 str when is_binary(str) -> case Integer.parse(str) do {int, ""} -> # 整数完全匹配,根据区间执行对应操作 cond do int < 10 -> do_low_value_operation(int) int >= 10 and int < 100 -> do_mid_value_operation(int) int >= 100 -> do_high_value_operation(int) end _ -> # 解析失败或者有剩余字符,统一归为非数值处理 handle_non_numeric() end # 处理字段不存在的情况 nil -> handle_missing_field() end end # 定义对应的业务操作函数 defp do_low_value_operation(int), do: IO.puts("处理小数值:#{int}") defp do_mid_value_operation(int), do: IO.puts("处理中数值:#{int}") defp do_high_value_operation(int), do: IO.puts("处理大数值:#{int}") defp handle_non_numeric(), do: IO.puts("遇到非数值内容,执行对应逻辑") defp handle_missing_field(), do: IO.puts("目标字段不存在,执行兜底逻辑")
额外优化小建议
- 如果API返回的非数值标记还有其他形式,可以直接在开头的匹配列表里补充,让逻辑更直观;
- 如果你在项目里频繁遇到这类转换需求,可以封装一个自定义的转换函数,或者用Ecto自定义类型(如果用了Ecto的话),让代码更复用。
内容的提问来源于stack exchange,提问作者Adam Millerchip
相关产品推荐
相关产品推荐

