斯卡拉模式匹配json

时间:2016-03-11 05:04:33

标签: json scala playframework websocket

我试图使用Activator提供的匿名聊天应用程序用于我自己的目的。我需要根据json字段值触发一个案例。我有这样的代码。

 def receive = LoggingReceive {
 case js: JsValue => {
  (js \ "status").validate[String] map {
    Utility.escape(_)
  }map {
    board ! Message(uid, _)
  }

我想将状态字段与字符串值匹配。我试过这种方法

 (js \ "status").validate[String] map {
    Utility.escape(_)
  }toString match {
    case "play" =>
      board ! Message(uid, "play")
    case "stop" =>
      board ! Message(uid, "stop")
  }

但是我得到了一个java.nio.channels.ClosedChannelException 即时通讯来自Java背景和Scala的新手 任何帮助都会很有帮助

1 个答案:

答案 0 :(得分:3)

您与validate[String]的结果匹配,JsSuccessJsError,所以我会这样做:

(js \ "status").validate[String] match {
  case JsSuccess("play", _) => board ! Message(uid, "play")
  case JsSuccess("stop", _) => board ! Message(uid, "stop")
  case _ => // something else!
}

如果"播放"并且"停止"是你期望通过直接在提取器中绑定命令来简化它的唯一值:

(js \ "status").validate[String] match {
  case JsSuccess(cmd, _) => board ! Message(uid, cmd)
}

如果你真的不关心状态的价值,如果它不存在或是别的,那么使用asOpt代替validate可能会更容易:

(js \ "status").asOpt[String].map { cmd =>
  board ! Message(uid, cmd)
}