scala - 如何模式匹配 JsStrings 的 JsArray
问题描述
例如,我有一个简单的作者 JSON:
{
"name": "string",
"articles": [
"string",
"string",
"string"
]
}
我正在定义 Json 阅读格式:
implicit object authorFormat extends RootJsonFormat[Author] {
override def write(a: Author) = ???
override def read(json: JsValue) = json.asJsObject.getFields("name", "articles") match {
case Seq(JsString(name), JsArray(articles)) => ... //Build author
}
}
这种模式匹配保证"articles"
是一个数组(的JsValues
)。但不能保证"articles"
是字符串数组。如何解决?
解决方案
尝试反序列化articles
喜欢List[String]
这样
articles.map(_.convertTo[String]).toList
如果jsonFormat2
不是一个选项。这是一个工作示例
import spray.json._
import DefaultJsonProtocol._
object MyApp extends App {
case class Author(name: String, articles: List[String])
implicit object authorFormat extends RootJsonFormat[Author] {
override def write(a: Author) = ???
override def read(json: JsValue) = json.asJsObject.getFields("name", "articles") match {
case Seq(JsString(name), JsArray(articles)) => Author(name, articles.map(_.convertTo[String]).toList)
}
}
val raw =
"""
|{
| "name": "string",
| "articles": [
| "string,
| "string",
| "string"
| ]
|}
""".stripMargin
val json = raw.parseJson
val author = json.convertTo[Author]
println(author)
}
哪个输出
Author(string,List(string, string, string))
而如果articles
包含这样的非字符串
val raw =
"""
|{
| "name": "string",
| "articles": [
| 1,
| "string",
| "string"
| ]
|}
""".stripMargin
我们得到错误
Exception in thread "main" spray.json.DeserializationException: Expected String as JsString, but got 1
推荐阅读
- python - 使用 python3.6 和 python3.7 在异步中使用 wait_for 的套接字泄漏
- salesforce - 修改代码以允许特定帐户的差异
- vba - 如何使用vba在大型机中查找文本是否突出显示
- java - maven安装时出现编译错误我该如何解决这个错误
- c++ - 列表的 C++ 重载 [][]
- authentication - 如何配置 IBM MQ v9 以使用 Microsoft AD 进行用户认证
- c# - 如何在c#中读取列表中多个csv文件的内容
- sql - 当数据字段组合与相同和不同列匹配时选择记录
- asp.net-core - 如何让 Wix Heat.exe 保留自定义文件 ID?
- ios - setVisibleMapRect 无法预测地与 edgePadding 一起工作