Scala中JSON解析获取字段带引号及模式匹配失败问题求助
问题原因分析
你碰到的这个坑其实很典型——(json \ "command").get返回的是一个JsString类型的JsValue,不是Scala原生的String。当你调用Json.stringify()或者直接.toString()时,本质是把这个JsString序列化成了JSON规范的字符串表示,所以会自动带上双引号,最终得到的是"connect"而非原生的connect,自然匹配不到你写的"connect"字符串。
正确解决方法
给你几种实用的处理方式,按需选择:
方法1:直接转原生字符串(最常用)
用.as[String]把JsValue转换成Scala原生的String类型:
val command = (json \ "command").as[String]
如果担心字段不存在或类型不匹配会报错,可以用.asOpt[String]返回Option[String]做安全处理:
val commandOpt = (json \ "command").asOpt[String] commandOpt match { case Some("connect") => println("connected") case Some(cmd) => println(s"unknown command: $cmd") case None => println("command字段缺失或类型错误") }
方法2:直接匹配JsValue类型
不用先提取值,直接在模式匹配里针对JsString做判断:
(json \ "command") match { case JsString("connect") => println("connected") case JsString(cmd) => println(s"unknown command: $cmd") case _ => println("command字段缺失或不是字符串类型") }
方法3:直接访问JsString的value属性(不推荐,仅特殊场景用)
如果你百分百确定拿到的是JsString,可以直接取它的value属性:
val command = (json \ "command").get.asInstanceOf[JsString].value
这种方式需要强制类型转换,不够优雅,除非你有特殊需求,否则优先选前两种。
小提醒
别搞混Json.stringify()的用途——它是用来把整个JsValue转换成JSON格式的字符串输出,不是用来提取Scala原生类型的。提取原生类型记得用as[T]、asOpt[T]或者直接匹配JsValue的子类。
内容的提问来源于stack exchange,提问作者Gimme the 411
相关产品推荐
相关产品推荐

