【问题标题】:Scala function TypeTag: T use type T in functionScala函数TypeTag:T在函数中使用类型T
【发布时间】:2018-06-21 05:14:39
【问题描述】:

我需要解析几个 json 字段,我正在使用 Play Json 来执行此操作。由于解析可能失败,我需要为每个字段抛出一个自定义异常。

要读取一个字段,我使用这个:

val fieldData = parseField[String](json \ fieldName, "fieldName")

我的 parseField 函数:

def parseField[T](result: JsLookupResult, fieldName: String): T = {
    result.asOpt[T].getOrElse(throw new IllegalArgumentException(s"""Can't access $fieldName."""))
}

但是,我收到一条错误消息:

Error:(17, 17) No Json deserializer found for type T. 尝试实现 此类型的隐式读取或格式。 result.asOpt[T].getOrElse(throw new IllegalArgumentException(s"""Can't access $fieldName."""))

有没有办法告诉asOpt[] 使用T 中的类型?

【问题讨论】:

    标签: scala


    【解决方案1】:

    我强烈建议您不要抛出异常。 Play JSON API 具有 JsSuccess 和 JsError 两种类型,可帮助您对解析错误进行编码。

    根据文档

    要将 Scala 对象与 JSON 相互转换,我们分别使用 Json.toJson[T: Writes] 和 Json.fromJson[T: Reads]。 Play JSON 提供了 Reads 和 Writes 类型类来定义如何读取或写入特定类型。您可以通过使用 Play 的自动 JSON 宏或手动定义它们来获得这些。您还可以使用validate、as 和asOpt 方法从JsValue 读取JSON。通常最好使用 validate,因为它返回一个 JsResult,如果 JSON 格式错误,它可能包含错误。

    见https://github.com/playframework/play-json#reading-and-writing-objects

    还有a good example on the Play Discourse forum 介绍了 API 在实践中的表现方式。

    【讨论】:

    • 太棒了,谢谢!我使用validate 选择了这个选项。这带来了另一个问题,但我认为这是另一个帖子。谢谢。
    猜你喜欢
    • 2019-06-30
    • 2021-10-23
    • 2011-11-26
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多