首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Argonaut验证Scalaz

用Argonaut验证Scalaz
EN

Stack Overflow用户
提问于 2015-04-13 01:16:55
回答 1查看 636关注 0票数 2

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

代码语言:javascript
复制
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,并返回一个Person或一些错误,作为一个列表。所以我需要:

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

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

代码语言:javascript
复制
{
  errors: ["Error1", "Error2"]
}

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-13 02:29:26

我把这作为一个答案,因为这是我解决问题的方法,但是我已经有一段时间没有跟上Argonaut的发展了,我很想知道有一个更好的方法。首先是设置,它修复了您的一些小问题,并添加了一个名称有效性的条件,以使后面的示例更有趣:

代码语言:javascript
复制
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)
}

然后在创建(String, Int)之前,我会将JSON解码成一个Person

代码语言:javascript
复制
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)
  }

然后:

代码语言:javascript
复制
scala> println(decodePerson("""{ "name": "", "age": 1 }"""))
Failure(NonEmptyList(Name too short, Age is under 18))

注意,在更复杂的情况下,这不会累积错误--例如,如果name字段的值是一个数字,而age1,则只会得到一个错误( name 1)。在这种情况下进行错误积累工作要复杂得多。

与此相关的是,您还将看到关于flatMap on Validation的不推荐的警告,您可以将其看作是提醒您不会在整个绑定中发生积累。您可以通过导入scalaz.Validation.FlatMap._来告诉编译器您理解它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29596564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档