2013-07-11 37 views
14

Tôi đã perks.conf:lặp trên các lĩnh vực trong typesafe cấu hình

autoshield { 
    name="autoshield" 
    price=2 
    description="autoshield description" 
} 
immunity { 
    name="immunity" 
    price=2 
    description="autoshield description" 
} 
premium { 
    name="premium" 
    price=2 
    description="premium description" 
} 
starter { 
    name="starter" 
    price=2 
    description="starter description" 
} 
jetpack { 
    name="jetpack" 
    price=2 
    description="jetpack description" 
} 

Và tôi muốn để lặp qua Perks trong một cái gì đó ứng dụng của tôi như thế này:

val conf: Config = ConfigFactory.load("perks.conf") 
val entries = conf.getEntries() 
for (entry <- entries) yield { 
    Perk(entry.getString("name"), entry.getInt("price"), entry.getString("description")) 
} 

Nhưng tôi không thể tìm thấy phù hợp phương thức trả về tất cả các mục từ cấu hình. Tôi đã thử config.root(), nhưng có vẻ như nó trả về tất cả các thuộc tính bao gồm hệ thống, akka và nhiều thuộc tính khác.

+0

Bạn đã thử [entrySet] (http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html#entrySet ())? – vidit

Trả lời

17

Ví dụ bạn đã đoạn mã sau vào Settings.scala

val conf = ConfigFactory.load("perks.conf") 

nếu bạn gọi entrySet trên cấu hình gốc (không conf.root(), nhưng đối tượng gốc của cấu hình này) nó sẽ trở về của bạn nhiều rác, những gì bạn cần phải làm là đặt tất cả các đặc quyền của bạn theo một số đường dẫn trong perks.conf:

perks { 
    autoshield { 
    name="autoshield" 
    price=2 
    description="autoshield description" 
    } 
    immunity { 
    name="immunity" 
    price=2 
    description="autoshield description" 
    } 
} 

và sau đó trong tập tin Settings.scala được cấu hình này:

val conf = ConfigFactory.load("perks.conf").getConfig("perks") 

và sau đó gọi mục nhậpThiết lập cấu hình này và bạn sẽ nhận được tất cả các mục nhập không phải từ đối tượng gốc, nhưng từ đặc quyền. Đừng quên rằng Typesafe Config được viết bằng java và entrySet trả về java.util.Set, vì vậy bạn cần phải nhập scala.collection.JavaConversions._

+0

+1 để hiển thị cho tôi '.getConfig()' - rất hữu ích – akauppi

25

entrySet thu gọn cây. Nếu bạn muốn để lặp qua con mắt duy nhất, sử dụng:

conf.getObject("perks").foreach({ case (k, v) => ... }) 

k sẽ là "autoshield" và "miễn dịch", nhưng không phải là "autoshield.name", "autoshield.price" vv

này yêu cầu bạn nhập scala.collection.JavaConversions._.

+0

Đây là câu trả lời được chấp nhận. 'JavaConversions' là một phần siêu hữu ích. – sph21

+0

Không có phương pháp như vậy :-( – user123

0

Đối với những ai có thể cần nó:

val sysProperties = System.getProperties 
val allConfig = ConfigFactory.load("perks.conf") 
val appConfig = allConfig.entrySet().filter { entry => 
    !sysProperties.containsKey(entry.getKey) 
} 
0

getObject đã cho tôi một đối tượng json đủ điều kiện (ví dụ timeout.ms = 5 trở thành { timeout: { ms: 5 }).

tôi đã kết thúc với:

conf.getConfig(baseKey).entrySet().foreach { entry => 
    println(s"${entry.getKey} = ${entry.getValue.unwrapped().toString}") 
} 
Các vấn đề liên quan