Можно ли использовать библиотеку 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.
Ответы
Ответ 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])