Извлечение строки из JSON с использованием Json4s с использованием Scala - PullRequest
1 голос
/ 05 мая 2020

У меня есть JSON тело в следующей форме:

val body = 
{
    "a": "hello",
    "b": "goodbye"
}

Я хочу извлечь ЗНАЧЕНИЕ «a» (поэтому я хочу «привет») и сохранить его в val. Я знаю, что должен использовать «синтаксический анализ» и «извлечение» (например, val parsed json = parse (body) .extract [String]), но я не знаю, как их использовать для конкретного извлечения значения «a»

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Чтобы использовать extract, вам нужно создать класс, который соответствует форме JSON, который вы анализируете. Вот пример использования ваших входных данных:

val body ="""
{
  "a": "hello",
  "b": "goodbye"
}
"""

case class Body(a: String, b: String)

import org.json4s._
import org.json4s.jackson.JsonMethods._

implicit val formats = DefaultFormats

val b = Extraction.extract[Body](parse(body))

println(b.a) // hello
1 голос
/ 05 мая 2020

Вам придется использовать сопоставление шаблонов / экстракторы:

val aOpt: List[String] = for {
  JObject(map) <- parse(body)
  JField("a", JString(value)) <- map
} yield value

в качестве альтернативы используйте запрос DSL

parse(body) \ "a" match {
  case JString(value) => Some(value)
  case _              => None
}

Это параметры, поскольку у вас нет гарантии, что произвольный JSON будет поле содержит "a".

См. документацию

extract имело бы смысл, если бы вы извлекали целое JObject в case class.

...