2010-10-01 14 views
11

Lift-json kütüphanesinin JObject sınıfını bir Harita gibi hareket etmek için kullanmanın bir yolu var mı? ÖrneğinJSON'u bir Haritaya ayrıştırmak için Scala lift-json kitaplığını kullanabilir miyim?

:

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> 

ben umuyordum kaydı ("foo") "bar" dönmek için

Bir değerler işlevini fark ve bir harita yazdırır ama gerçek nesne olduğunu 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")

bir vaka sınıfını ayıklanması asansör-json kütüphanesi ile örnek var ama bu durumda, önceden json şema bilmiyorum.

+0

: Veri (adı, tanımı, yaş) içerir ve yaş isteğe bağlıysa

Not içine o JSON okuyabilir http://stackoverflow.com/questions/5051290/deserializing-case-classes-with-mapstring-any-properties-with-lift-json/6310493#6310493 –

cevap

12

Uygulamayla bakarsanız, sen

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 
} 

göreceksiniz Yani bu çalışması gerekir:

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

Ayrıca

record.values.apply("foo") 
+0

Teşekkürler, ilk çalışma, başvurunun ikinci seçeneği geçerlidir () bir hata döndürür. Scala'nın yerleşik java ayrıştırıcısını kullanarak bitti. scala.util.parsing.json.JSON.parseFull (kayıt) bazı (Harita) veya Bazı (Liste) –

7

JValue.Values ​​deneyebilirsiniz bir edilir yola bağımlı tür. Bir JString üzerinde tutun, bir String olacak ya da bir JArray varsa bir Liste [Any] olacak demektir. Ayrıştırdığınız JSON'un bir JSON nesnesi olduğundan eminseniz, uygun bir türe atabilirsiniz.

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

JObject için bir yol bağımlı tip böylece Harita [String, Herhangi] şöyledir: merakı

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

Sadece, biraz sorunlu sen şeklini bilmiyorum değilse olduğunu verileri ayrıştırmak mı istiyorsunuz? Bu durum sınıflarında bir parametre olarak Haritası ayrıştırma için ilgili cevaptır

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

döndürür. Farklı alanlara sahip bir jsonum var. Örn. İlk belgede (isim, açıklama, yaş) olabilir, ancak ikinci belge yalnızca belirtilen (ad, yaş) olabilir. Eğer scala'nın Map nesnesini kullanırsam, sadece document.getOrElse ("foo", "") diyebilirim –

İlgili konular