Scala десериализует JSON в коллекцию - PullRequest
0 голосов
/ 02 июля 2018

Мой JSON-файл содержит ниже детали { "категория": "возраст, пол, почтовый индекс" }

Мой код скалы ниже единицы

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) = пример List (возраст, пол, почтовый индекс), но мне нужен вывод Seq (String), пожалуйста, если у кого-то есть идеи по этому поводу, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Просто прочитайте JSON как JsonNode и получите доступ к свойству напрямую:

val jsonNode = objectMapper.readTree(json.reader())
val parsedJson = jsonNode.get("category").asText
0 голосов
/ 02 июля 2018

Идея в scala заключается в том, чтобы быть по возможности безопасным, если вы отдаете его, используя Map[String, Any].

Итак, я рекомендую использовать класс данных, который представляет ваши данные JSON.

Пример,

определить маппер,

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] вы не можете указать все вложенные структуры данных,

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.

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)
...