Scala 将 JSON 反序列化为集合 [英] Scala deserialize JSON to Collection

查看:92
本文介绍了Scala 将 JSON 反序列化为集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 JSON 文件包含以下详细信息{类别":年龄,性别,邮政编码"}

My JSON File containes below details { "category":"age, gender,post_code" }

我的Scala代码低于一个

My scala code is below one

val filename = args.head
println(s"Reading ${args.head} ...")
val json = Source.fromFile(filename)
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
val parsedJson = mapper.readValue[Map[String, Any]](json.reader())   
val data = parsedJson.get("category").toSeq

它正在返回 Seq(Any) = 示例列表(年龄,性别,post_code),但我需要 Seq(String) 输出,如果有人对此有任何想法,请帮助我.

It's returning Seq(Any) = example List(age, gender,post_code) but I need Seq(String) output please if any has an idea about this please help me.

推荐答案

scala 中的想法是尽可能使用 Map[String, Any] 来实现类型安全.

The idea in scala is to be typesafe whenever possible which you are giving away using Map[String, Any].

因此,我建议使用代表您的 JSON 数据的数据类.

So, I recommend using a data class that represents your JSON data.

例子,

定义映射器,

scala> import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper

scala> import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

scala> import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.DefaultScalaModule

scala> val mapper = new ObjectMapper() with ScalaObjectMapper
mapper: com.fasterxml.jackson.databind.ObjectMapper with com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper = $anon$1@d486a4d

scala> mapper.registerModule(DefaultScalaModule)
res0: com.fasterxml.jackson.databind.ObjectMapper = $anon$1@d486a4d

现在,当您反序列化为 Map[K, V] 时,您不能指定所有嵌套的数据结构,

Now, when you deserialise to Map[K, V] you can not specify all the nested data-structures,

scala> val jsonString = """{"category": ["metal", "metalcore"], "age": 10, "gender": "M", "postCode": "98109"}"""
jsonString: String = {"category": ["metal", "metalcore"], "age": 10, "gender": "M", "postCode": "98109"}

scala> mapper.readValue[Map[String, Any]](jsonString)
res2: Map[String,Any] = Map(category -> List(metal, metalcore), age -> 10, gender -> M, postCode -> 98109)

以下是一种将一些密钥转换为所需数据结构的解决方案,但我个人不推荐.

scala> mapper.readValue[Map[String, Any]](jsonString).get("category").map(_.asInstanceOf[List[String]]).getOrElse(List.empty[String])
res3: List[String] = List(metal, metalcore)

最好的解决方案是定义一个数据类,我在下面的示例中将其称为 SomeData 并将其反序列化.SomeData 是根据您的 JSON 数据结构定义的.

Best solution is to define a data class which I'm calling SomeData in following example and deserialize to it. SomeData is defined based on your JSON data-structure.

scala> final case class SomeData(category: List[String], age: Int, gender: String, postCode: String)
defined class SomeData

scala> mapper.readValue[SomeData](jsonString)
res4: SomeData = SomeData(List(metal, metalcore),10,M,98109)

scala> mapper.readValue[SomeData](jsonString).category
res5: List[String] = List(metal, metalcore)

这篇关于Scala 将 JSON 反序列化为集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆