我需要解析几个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
中的类型?
答案 0 :(得分:2)
我强烈建议您不要抛出异常。 Play JSON API具有JsSuccess
和JsError
类型,可帮助您编码解析错误。
根据文档
要在Scala对象与JSON之间进行转换,我们分别使用
Json.toJson[T: Writes]
和Json.fromJson[T: Reads]
。 Play JSON提供读取和写入类型类,以定义如何读取或写入特定类型。您可以通过使用Play的自动JSON宏或手动定义它们来获取它们。您还可以使用JsValue
,validate
和as
方法从asOpt
读取JSON。通常,最好使用validate,因为它会返回JsResult
,如果JSON格式不正确,则可能包含错误。
请参见https://github.com/playframework/play-json#reading-and-writing-objects
关于API如何在实践中体现的问题,还有a good example on the Play Discourse forum。