首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简化2种类似的json辅助函数

简化2种类似的json辅助函数
EN

Stack Overflow用户
提问于 2013-11-19 02:08:49
回答 1查看 83关注 0票数 2

我有两个类似的功能。一个在成功时返回一个字符串,第二个在成功时返回一个OptionString。如何才能以更优雅的方式编写它,也许可以调用第二个函数中的第一个函数呢?谢谢!

代码语言:javascript
运行
复制
  private def readString(j: JsValue, key: String): Validation[String, String] = {
    j \ key match {
      case j: JsString =>
        Success(j.value)
      case j: JsUndefined =>
        Failure(s"Missing field $key")
      case j: JsValue =>
        Failure(s"Field $key value is not a string")
    }
  }

  private def readStringOpt(j: JsValue, key: String): Validation[String, Option[String]] = {
    (j \ key).as[JsValue] match {
      case j: JsString =>
        j.value.some.success
      case j: JsUndefined =>
        None.success
      case x =>
        Failure(s"Field $key value is not a string")
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 06:50:42

首先,您的第二个方法中的.as[JsValue]并不是真正必要的--它所做的就是查找JsValueReads实例,它只是通过它的参数传递,并且从不失败。

如果您想按照上面建议的路线(根据其他版本定义Opt-less版本),Scalaz提供了一些稍微简洁的语法:

代码语言:javascript
运行
复制
def readString(j: JsValue, key: String): Validation[String, String] =
  readStringOpt(j, key).flatMap(_.toSuccess(s"Missing field $key"))

然而,这将在最近版本的Scalaz中给您一个不推荐的警告,因为Validation没有单一实例,而且它的flatMap是一种谎言。这意味着您有两个选项(除了忽略弃用警告之外):您可以切换到\/,它是一元的,或者您可以使用折叠:

代码语言:javascript
运行
复制
def readString(j: JsValue, key: String): Validation[String, String] =
  readStringOpt(j, key).fold(_.failure, _.toSuccess(s"Missing field $key"))

这有点冗长,但它让你站在验证的右边,而不是一个单一的神。

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

https://stackoverflow.com/questions/20061808

复制
相关文章

相似问题

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