Подтвердить что ты не робот

Можно ли использовать библиотеку Scala lift-json для анализа JSON на карте?

Есть ли способ использовать класс JObject библиотеки lift-json для работы как Map?

Например:

val json = """
{ "_id" : { "$oid" : "4ca63596ae65a71dd376938e"} , "foo" : "bar" , "size" : 5}
"""

val record = JsonParser.parse(json)
record: net.liftweb.json.JsonAST.JValue = JObject(List(JField(_id,JObject(List(JField($oid,JString(4ca63596ae65a71dd376938e))))), JField(foo,JString(bar)), JField(size,JInt(5))))

</code>

Я бы ожидал, что запись ( "foo" ) вернет "бар"

Я заметил функцию значений и распечатал карту, но фактический объект - это JValue.this.Values?

scala> record.values res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))

scala > record.values("foo") :12: error: record.values of type record.Values does not take parameters record.values("foo")

Есть примеры, когда библиотека lift-json извлекает класс case, но в этом случае я заранее не знаю схему json.

4b9b3361

Ответ 1

Если вы посмотрите на реализацию, вы увидите

case class JObject(obj: List[JField]) extends JValue {
  type Values = Map[String, Any]
  def values = Map() ++ obj.map(_.values.asInstanceOf[(String, Any)]) // FIXME compiler fails if cast is removed
}

Итак, это должно работать:

record.values.asInstanceOf[Map[String, Any]]("foo")

Вы также можете попробовать

record.values.apply("foo")

Ответ 2

JValue.Values ​​- это зависимый от пути тип. Это означает, что если вы держите JString, это будет строка, или если у вас есть JArray, это будет List [Any]. Если вы уверены, что JSON, который вы разбираете, является объектом JSON, вы можете применить его к соответствующему типу.

val record = JsonParser.parse(json).asInstanceOf[JObject]

Тип, зависимый от пути для JObject, представляет собой Map [String, Any], таким образом:

scala> record.values("foo")                                     
res0: Any = bar

Просто любопытство, разве это не проблема, если вы не знаете форму данных, которую собираетесь анализировать?

Примечание. Если ваши данные содержат (имя, описание, возраст), а возраст не является обязательным, вы можете прочитать, что JSON:

case class Person(name: String, description: String, age: Option[Int])