2013-06-19 18 views
14

Hocon format içinde yapılandırmayı kullanan bir Uygulama uygulaması (2.1) oluşturdum.Hocon: Yapılandırma dosyasından bir nesne dizisini oku

Yapılandırmada bir dizi proje eklemek istiyorum. Dosya conf/application.conf şuna benzer:

... 
projects = [ 
    {name: "SO", url: "http://stackoverflow.com/"}, 
    {name: "google", url: "http://google.com"} 
] 

benim Scala projesinde bu yapılandırmayı okumaya çalışın:

import scala.collection.JavaConversions._ 
case class Project(name: String, url: String) 

val projectList: List[Project] = 
    Play.maybeApplication.map{x => 
    val simpleConfig = x.configration.getObjectList("projects").map{y => 
     y.toList.map{z => 
     Project(z.get("name").toString, z.get("url").toString) // ?!? doesn't work 

     ... 
    }}}}}}}} // *arg* 

Bu yaklaşım ben Options bir çok kayboldum, çok karmaşık gibi görünüyor, ve Eclipse IDE bana derslerle ilgili herhangi bir ipucu veremez.

Hocon yapılandırma dosyasından bir dizi nesneyi nasıl okuyabileceğinize dair örnek var mı? Veya bunun için bir JSON dosyası Hocon yerine bir JSON-ayrıştırıcısı ile kullanmalı mıyım?

cevap

8

benim için aşağıdaki eserlerini Oynat 2.1.2'de (Gerçi benim play.Play nesne üzerinde bir .maybeApplication yok, ve senin ne neden emin değilim):

import play.Play 
import scala.collection.JavaConversions._ 
case class Project(name: String, url: String) 

val projectList: List[Project] = { 
    val projs = Play.application.configuration.getConfigList("projects") map { p => 
    Project(p.getString("name"), p.getString("url")) } 
    projs.toList 
} 

println(projectList) 

verilmesi çıkışı:

Ben (yine API farklı sen var gibi) ya Option durumlarda bir sürü kaybolmak olmadığı halde
List(Project(SO,http://stackoverflow.com/), Project(google,http://google.com)) 

, bir sürü farklı olmayacak. bunun yerine atmalarını veya .toString() aramalar başvurmadan geri çağrılmasına türlerini belirtmek için sağlayan, List[play.Configuration] döndürür beri

Daha da önemlisi, getConfigList, yapmak istediğiniz şey için daha yakın bir maç gibi görünüyor.

+0

Teşekkürler, çok daha kolay görünüyor. Play 2.1.2 ile bu cevabı birkaç hafta içinde (... tatil günleri ...) kontrol edeceğim. – Sonson123

1

Dizinin içeriğinin Json olduğu ve bir vaka sınıfınız olduğu göz önüne alındığında, Json Play API kullanmayı deneyebilir ve nesnelerle bu şekilde çalışabilirsiniz. Inception parçası, önemsiz hale getirmelidir.

+0

Evet, bir JSON dosyası ayrıştırma Hocon ayrıştırma çok daha kolay gibi görünüyor (2.4+ Enjeksiyon Çal kullanma). Bu bir çözüm olurdu, ama sonra Json'a Hocon'u sunan avantajları kaybediyorum. Json Play Api gibi bir Hocon-Parser-API havalı olurdu. – Sonson123

2

Bu bölüm y.toList.map{z => ile ne yapmaya çalışıyorsunuz? Eğer sonuç olarak Project bir koleksiyon istiyorsanız, neden sadece yapın: Bu durumda

val simpleConfig = x.configration.getObjectList("projects").map{y => 
    Project(y.get("name").toString, y.get("url").toString) 
} 

, map operasyon y budur ConfigObject örneklerini alarak olmalıdır. Bu sizin Project örneklerini almanız için gereken her şeye sahip görünüyor, bu yüzden toList neden ConfigObject (Map olan) listesinin Tuple2 Listesinin içine girip daha sonra yeniden eşleştirdiğinden emin değilim.

+1

'getObjectList' bir' Seçenek [java.util.List [_ <: ConfigObject]] 'döndürür,' '' '' java.util '' olur.[_ <: ConfigObject] 'ı listeleyin. Başka bir şey: 'y.get (" isim "). ToString' f.ex. 'ConfigString ("google") ', ham değeri nasıl alacağımı bilmiyorum. Bir nesne dizisini okumak çok karmaşık görünüyor, daha kolay bir yol olmalı? – Sonson123

2

strangefeatures sonra benzer normal HOCON yapılandırması bu çalışacaktır cevap verirseniz

import javax.inject._ 
import play.api.Configuration 

trait Barfoo { 
    def configuration: Configuration  
    def projects = for { 
    projectsFound <- configuration.getConfigList("projects").toList 
    projectConfig <- projectsFound 
    name <- projectConfig.getString("name").toList 
    url <- projectConfig.getString("url").toList 
    } yield Project(name,url) 
} 

class Foobar @Inject() (val configuration: Configuration) extends Barfoo