Могу ли я использовать библиотеку Scala lift-json для анализа JSON на карте? - PullRequest
11 голосов
/ 02 октября 2010

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

Например:

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")чтобы вернуть "bar"

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

scala> record.values res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))</p> <p>scala> record.values("foo") :12: error: record.values of type record.Values does not take parameters record.values("foo")

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

Ответы [ 2 ]

12 голосов
/ 02 октября 2010

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

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")
7 голосов
/ 02 октября 2010

JValue.Values ​​является зависимым от пути типом.Это означает, что если вы удерживаете JString, это будет String, или если вы получили 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])
...