Scala函数TypeTag:T在函数中使用类型T

时间:2018-06-20 20:57:03

标签: scala

我需要解析几个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."""))
}

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

  

错误:(17,17)找不到类型T的Json反序列化器。尝试实现   此类型的隐式读取或格式。       result.asOpt [T] .getOrElse(引发新的IllegalArgumentException(s“”“无法访问$ fieldName。”“”))

是否可以告诉asOpt[]使用T中的类型?

1 个答案:

答案 0 :(得分:2)

我强烈建议您不要抛出异常。 Play JSON API具有JsSuccessJsError类型,可帮助您编码解析错误。

根据文档

  

要在Scala对象与JSON之间进行转换,我们分别使用Json.toJson[T: Writes]Json.fromJson[T: Reads]。 Play JSON提供读取和写入类型类,以定义如何读取或写入特定类型。您可以通过使用Play的自动JSON宏或手动定义它们来获取它们。您还可以使用JsValuevalidateas方法从asOpt读取JSON。通常,最好使用validate,因为它会返回JsResult,如果JSON格式不正确,则可能包含错误。

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

关于API如何在实践中体现的问题,还有a good example on the Play Discourse forum