使用 Argonaut 进行 Scalaz 验证

2024-01-12

我有一个案例类和伴随对象:

case class Person private(name: String, age: Int)

object Person {

  def validAge(age: Int) = {
    if (age > 18) age.successNel else "Age is under 18".failureNel
  }

  def validName(name: String) = {
    name.successNel
  }

  def create(name: String, age: Int) = (validAge(age) |@| validName(name))(Person.apply)

}

我想使用 Argonaut 解析一些 JSON 并返回一个人或一些错误,作为列表。所以我需要:

  1. 从字符串中读取 JSON,并验证字符串的格式是否正确
  2. 将 JSON 解码为 Person 或错误字符串列表。

我想以某种形式返回错误,我可以将其转换为更多 JSON,例如:

{
  errors: ["Error1", "Error2"]
}

我首先尝试使用Argonauts的decodeValidation方法,该方法返回一个Validation[String, X]。不幸的是,我需要一个错误列表。

有什么建议么?


我将其添加为答案,因为这是我立即解决问题的方法,但我已经有一段时间没有密切关注 Argonaut 的开发了,我很想听到有一个更好的方法。首先是设置,它修复了您的一些小问题,并添加了名称有效性的条件,以使后面的示例更有趣:

import scalaz._, Scalaz._

case class Person private(name: String, age: Int)

object Person {
  def validAge(age: Int): ValidationNel[String, Int] =
    if (age > 18) age.successNel else "Age is under 18".failureNel

  def validName(name: String): ValidationNel[String, String] =
    if (name.size >= 3) name.successNel else "Name too short".failureNel

  def create(name: String, age: Int) =
    (validName(name) |@| validAge(age))(Person.apply)
}

然后我将 JSON 解码为(String, Int)在创建之前配对Person:

import argonaut._, Argonaut._

def decodePerson(in: String): ValidationNel[String, Person] =
  Parse.decodeValidation(in)(
    jdecode2L((a: String, b: Int) => (a, b)
  )("name", "age")).toValidationNel.flatMap {
    case (name, age) => Person.create(name, age)
  }

进而:

scala> println(decodePerson("""{ "name": "", "age": 1 }"""))
Failure(NonEmptyList(Name too short, Age is under 18))

请注意,在更复杂的情况下,这不会累积错误 - 例如如果的值name字段是一个数字并且age is 1,你只会得到一个错误(name一)。在这种情况下,使错误累积发挥作用将要复杂得多。

相关地,您还会看到有关以下内容的弃用警告flatMap on Validation,您可以将其视为提醒,累积不会跨界发生。您可以通过导入告诉编译器您理解scalaz.Validation.FlatMap._.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Argonaut 进行 Scalaz 验证 的相关文章

  • Scala 中的条件未来

    给定这两个 future 仅当条件为真时我才需要运行第一个 future 请参阅if y gt 2 但我有一个例外Future filter predicate is not satisfied 这是什么意思以及如何修复该示例 object
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 如何修复 jq 扁平化 JSON 数组的重复输出

    我正在尝试使用 jq 命令压平 JSON 文件 但输出是重复的 请在这里查看我的jqplay https jqplay org s gwvMIH fed https jqplay org s gwvMIH fed 我的输入 JSON cos
  • 将 Scala Future 转变为 CompletableFuture

    我的项目中有一个 Akka 层 它返回Scala Future 而接收 Future 的部分是 Java 风格的 团队中的人不了解 Scala 他们宁愿使用CompletableFuture因为他们更了解 Java 8 API 有没有什么好
  • 纯文本形式的 Google+ 关注者

    如何以纯文本形式获取 google plus 关注者 JSON 或 XMLhttps developers google com api latest people get https developers google com api l
  • 如何删除spark输出中的compactbuffer

    下面是我在spark shell中运行的程序 但是当我将输出保存在HDFS中时 我得到带有compactbuffer的输出 如何删除spark输出中的compactbuffer Program val a sc textFile datag
  • 在 swift 中发送自定义 HTTP 标头

    我设法从服务器获取 json 但现在我想通过 http 标头添加额外的安全性 这就是我的代码现在的样子 let urlPath http www xxxxxxxx com let url NSURL string urlPath let s
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • Spark 对 RDD 中按值排序

    我有一个火花对 RDD 键 计数 如下 Array String Int Array a 1 b 2 c 1 d 3 使用spark scala API如何获取按值排序的新RDD对 所需结果 Array d 3 b 2 a 1 c 1 这应
  • 无法在 NetBeans 7.4rc1 上安装 nb-scala

    我已经安装了 NB 7 4rc1 并从下载了 nb scalahttp sourceforge net projects erlybird files nb scala http sourceforge net projects erlyb
  • 如何在 IntelliJ IDEA 中关闭具有 Unit 返回类型的 Scala 自动完成函数?

    IntelliJ IDEA Scala 插件具有自动添加功能 Unit到单位返回函数的末尾 例如 如果我正在编写一个有副作用的函数foo def foo 当我击中Enter当光标位于大括号之间时 我将得到以下内容 def foo Unit
  • angularjs - 将对象数组(JSON 数据)发布到 PHP 页面

    我的 JSON 数据的示例如下 scope a email keval gmail permissions upload 1 edit 1 email new aa permissions upload 1 edit 1 我想发布同样的内容
  • 在 Javascript 中使用 fetch API 接收和处理 JSON

    在我的项目中 当条件不足时 我的 Django 应用程序会发送带有消息的 JSON 响应 我使用这个 JsonResponse 指令 Code data is taken email email return JsonResponse da
  • 避免函数内装箱/拆箱

    对于数字密集型代码 我编写了一个具有以下签名的函数 def update f Int Int Double gt Double Unit 然而 因为Function3不是专门的 每个应用程序f结果对 3 个参数和结果类型进行装箱 拆箱 我可
  • Play 框架:异步与同步性能

    我有以下代码 def sync Action val t0 System nanoTime Thread sleep 100 val t1 System nanoTime Ok Elapsed time t1 t0 1000000 0 ms
  • 在 Scala 中设计方便的默认值映射

    我发现自己使用了很多嵌套映射 例如 Map Int Map String Set String 并且我希望在访问新密钥时自动创建新的 Map Set 等 例如 像下面这样 val m m 1992 foo bar 请注意 如果不需要 我不想
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 使用 JSON 的 Pentaho HTTP Post

    我是 Pentaho 的新手 我正在尝试执行以下工作流程 从数据库中读取一堆行 做一些转换 将它们以 JSON 格式发布到 REST Web 服务 我已经使用输入步骤和 Json 输出步骤解决了前两个问题 但是 我在执行最后一步时遇到两个问
  • PHP Json_encode 将空格更改为加号 +

    我有一个网络应用程序 我首先将 JSON 数据存储在 cookie 中 然后每 x 秒保存到数据库 它只是打开与服务器的连接 服务器读取 cookie 它实际上并不通过 POST 或 GET 发送任何内容 当我保存到 cookie 时 我的
  • GSON 将带有日历的对象反序列化为带有 Mongo 日期的 json 并返回

    我有一些实体 其中包含一些日历属性 我想以将它们存储为 GSON 序列化 JSON 中的日期的方式对其进行序列化 因为 Mongo 可以将 date 存储为 new ISODate 我们通常通过使用 ExclusionStrategy 忽略

随机推荐

  • .Value = "" 和 .ClearContents 之间有什么区别?

    如果我运行以下代码 Sub Test 1 Cells 1 1 ClearContents Cells 2 1 Value End Sub 当我使用公式检查 Cells 1 1 和 Cells 2 1 时ISBLANK 两个结果都返回TRUE
  • 指定的解决方案配置“最新|任何 CPU”无效

    我在 Jenkins 中运行的 MSBuild 脚本遇到此错误 C
  • 将 HTML 导出到 Excel 的单元格背景颜色

    我正在尝试将 HTML 表导出到 Excel 但我无法通过 CSS 设置单元格的背景颜色 我尝试过 Response Write 但这对我的输出没有影响 单元格颜色是否有一些 mso css 属性 尝试使用类似的东西
  • 在 Android 中编写许多 HTTP 请求的良好设计模式

    在我的应用程序中 我有很多 GET POST PUT 请求 现在 我有一个单例类来保存我下载的数据 并且有许多扩展 AsyncTask 的内部类 在我的单例类中 我还有一些这样的接口 Handlers for notifying liste
  • IMagick 检查图像亮度

    我需要能够在图像内自动写入一些文本 根据图像亮度 脚本必须用白色或黑色书写 那么如何使用 Imagick 检查图像的亮度 暗度呢 你可以这样做 Load the image imagick new Imagick image jpg con
  • Django/Python:了解 super 在函数中的使用方式

    我刚刚开始思考什么super以及它是如何在 Django 中基于视图的类中实现的 我试图了解 super 在以下代码中是如何工作的 有人可以尝试为我一点一点地分解它吗 from django views generic detail imp
  • Bash 忽略特定命令的错误

    我正在使用以下选项 set o pipefail set e 在 bash 脚本中 出现错误时停止执行 我有大约 100 行脚本正在执行 我不想检查脚本中每一行的返回代码 但对于一个特定的命令 我想忽略该错误 我怎样才能做到这一点 解决方案
  • 从 SearchView 更改片段提交又名级联到后台堆栈

    我目前正在使用SearchView对象 以便为我的应用程序提供建议输入的功能 然而 这个小部件在提交时使用intent filter开始您的搜索 当我的应用程序在手机上运行时 这非常棒 因为我想做的是启动搜索结果Activity显示响应 H
  • Devise - 如果帐户未确认,则重定向到页面

    如果用户的帐户尚未得到确认 我会尝试重定向用户 所以这涉及到两部分代码 首次创建帐户后重定向用户 如果他们在确认帐户之前尝试登录 请重定向他们 我需要第二个方面的帮助 我首先能够通过放入after inactive sign up path
  • Maven 编译器插件

    我知道默认的 Maven 编译器插件绑定到 compile 测试编译 生命周期 一般在不指定附加配置的情况下 我们不必 在我们的 POM 中明确定义它 但我仍然看到经验丰富的开发人员将诸如 这在他们的 POM 中 例如
  • 如何禁用主干历史记录但仍允许基于哈希的路由?

    假设我执行以下操作 单击主页 上的链接并转到 posts 1 触发事件并前往主干路由 posts 1 1 edit 我点击返回 我需要这样做 以便用户最终回到主页 而不是回到 posts 1 所以我需要允许骨干哈希路由工作但不修改历史记录
  • gcc 抑制警告“太小,无法容纳所有值”

    我需要使用范围枚举 以便我可以将它们作为特定类型传递给我们的序列化程序 我已经为枚举成员给出了明确的整数值Enum1 我已将与上面的描述相匹配的两个作用域枚举放入位字段中 enum class Enum1 value1 0x0 value2
  • Recyclerview 按字母顺序滚动条

    我需要实现一个类似于三星音乐应用程序的recyclerview字母滚动条 由于信誉低 我无法发布图像 我已阅读有关此的所有帖子 但我不想要气泡卷轴 我将所有字母表都放在垂直 LinearLayout 中 我想知道如何滚动到特定项目 你可以用
  • 如何在 JavaScript 中使用 x,y 坐标模拟点击?

    是否可以使用给定的坐标来模拟网页中 JavaScript 的点击 您可以派遣一个click事件 尽管这与真正的点击不同 例如 它不能用于欺骗跨域 iframe 文档 使其认为它已被单击 所有现代浏览器都支持document elementF
  • 在Python中按索引从列表中删除元素的简洁方法

    我有一个字符列表和索引列表 myList a b c d toRemove 0 2 我想通过一次操作得到这个 myList b d 我可以做到这一点 但有没有办法做得更快 toRemove reverse for i in toRemove
  • Java FileWriter 和 BufferedWriter 的区别

    它们之间有什么区别 我刚刚学习 Java ATM 但似乎我可以两种方式写入文件 我没有在这里复制 try catch 块 FileWriter file new FileWriter foo txt file write foobar fi
  • 张量流:在多个检查点运行模型评估

    在我当前的项目中 我训练一个模型并每 100 个迭代步骤保存检查点 检查点文件全部保存到同一目录 model ckpt 100 model ckpt 200 model ckpt 300 等 之后 我想根据所有已保存检查点 而不仅仅是最新检
  • WPF 数据网格样式

    有谁知道 有如何将 WPF DataGrid 布局更改为卡片视图或其他任何东西的示例 而不仅仅是行堆栈 结果看起来像这样 替代文本 http iwebthereforeiam com files ScreenShot gif http iw
  • 如何保证训练阶段不会出现OOM?

    标题中的问题已经完成 如何保证训练阶段不会出现OOM 只是一些旁注 根据我的经验 有两种 OOM 情况 一种是模型和小批量所需的内存大于您拥有的内存 在这种情况下 训练阶段将永远不会开始 解决这个问题的解决方案是使用较小的批量大小 尽管如果
  • 使用 Argonaut 进行 Scalaz 验证

    我有一个案例类和伴随对象 case class Person private name String age Int object Person def validAge age Int if age gt 18 age successNe