如何创建具有不同类型值的 Json 对象?
我正在使用喷雾 json
这是代码
val images : List[JsObject] = fetchImageUrls(url).map((url: String) => {
JsObject(List(
"link_path" -> JsString(url),
"display_name" -> JsString("image"),
"size" -> JsString(""),
"modified" -> JsString(""),
"thumbnail" -> JsString(url),
"filename" -> JsString("image"),
"is_dir" -> JsBoolean(x = false),
"thumb_exists" -> JsBoolean(x = true)) )
})
val jsonAst: JsObject = JsObject(List(
"client" -> JsString("urlimages"),
"view" -> JsString("thumbnails"),
"contents" -> JsArray(images)
))
它有效,但看起来很重。有没有办法用这样的代码定义json?
val images : List[List[(String, Any)]] = fetchImageUrls(url).map((url: String) => {
List(
"link_path" -> url,
"display_name" -> "image",
"size" -> "",
"modified" -> "",
"thumbnail" -> url,
"filename" -> "image",
"is_dir" -> false,
"thumb_exists" -> true)
})
val jsonAst = List(
"client" -> "urlimages",
"view" -> "thumbnails",
"contents" -> images
).toJson
这么说是行不通的
Cannot find JsonWriter or JsonFormat type class for List[(String, Object)]
).toJson
^
我得到,每个字段的类型在编译时没有定义。但是,如果序列化程序无论如何都进行模式匹配,为什么它不起作用?
谢谢!
最佳答案
我同意@alex23 的观点,即基于案例类的方法会更好。使用 Spray-json,您首先要定义案例类结构以及 DefaultJsonProtocol 的扩展,以描述您希望能够序列化的案例类。那看起来像这样:
case class Image(link_path:String, display_name:String, size:Option[String],
modified:Option[String], thumbnail:String, filename:String, is_dir:Boolean, thumb_exists:Boolean)
object Image
case class UrlImages(client:String, view:String, contents:List[Image])
object UrlImages
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val imageFormat = jsonFormat8(Image.apply)
implicit val urlImagesFormat = jsonFormat3(UrlImages.apply)
}
然后,您的示例的修改版本将如下所示:
import MyJsonProtocol._
val images : List[Image] = fetchImageUrls(url).map((url: String) => {
Image(url, "image", None, None, url, "image", false, true)
})
val jsonAst = UrlImages("urlimages", "thumbnails", images).toJson
您看到该错误的原因是 Spray-json 不知道如何序列化您正在创建的元组列表。如果您真的想使用该结构而不是走案例类路线,那么您可以考虑为 List[(String,Any)] 提供自定义序列化程序。查看spray-json 文档中标题为“为其他类型提供JsonFormats”的部分。如果您想走这条路并需要更多帮助,请告诉我。
关于json - 如何创建具有不同类型值的 Json 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16313902/