【问题标题】:How to handle error in JSON data has incorrect is node如何处理 JSON 数据中的错误是节点不正确
【发布时间】:2015-02-20 14:24:54
【问题描述】:

我期待以下 json 格式:

'{
  "teamId" : 9,
  "teamMembers" : [ {
    "userId" : 1000
  }, {
    "userId" : 2000
  }]
}'

如果我用以下格式测试我的代码:-

'{
  "teaXmId" : 9,
  "teamMembers" : [ {
    "usXerId" : 1000
  }, {
    "userXId" : 2000
  }]
}' 

我正在解析json值如下:-

val userId = (request.body \\ "userId" )
val teamId = (request.body \ "teamId")
val list = userId.toList
list.foreach( x => Logger.info("x val: "+x)

它不会抛出任何要处理的错误。代码执行合二为一。以后如果我尝试使用teamId或userId,那当然不行。

那么如何检查解析是否正确或立即停止执行并通知用户提供正确的json格式

【问题讨论】:

  • 当您甚至不提及您正在使用的 json 库时,这很难提供帮助

标签: json scala parsing error-handling


【解决方案1】:

如果使用\ 时未找到值,则结果将是JsUndefined(msg) 类型。你可以通过确保你有你期望的类型来立即抛出一个错误:

 val teamId = (request.body \ "teamId").as[Int]

或:

val JsNumber(teamId) = request.body \ "teamId" //teamId will be BigDecimal

当使用\\时,如果没有找到,则返回一个空的List,这是有道理的。如果您想在数组的任何对象上找不到某个键时抛出错误,您可能会获取包含列表的对象并从那里继续:

val teamMembers =  (request.body \"teamMembers").as[Seq[JsValue]]

或:

val JsObject(teamMembers) = request.body \ "teamMembers"    

然后:

val userIds = teamMembers.map(v => (v \ "userId").as[Int])

【讨论】:

  • 显然假设他正在使用 play json(对吗?)。但他也可以使用 lift json(它的 AST 节点上也有 \\ 和 \ 方法,但没有 as 方法)。
  • 你说得对——我假设是 json 库。如果他使用升降机,这将不适用。好电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多