Typesafe配置:如何迭代配置项

j3d*_*j3d 8 scala playframework typesafe-config

在我的Play应用程序中,我有一个这样的配置:

social {
    twitter {
        url="https://twitter.com"
        logo="images/twitter.png"
    }
    facebook {
        url="https://www.facebook.com"
        logo="images/facebook.png"
    }
}
Run Code Online (Sandbox Code Playgroud)

我会迭代所有social条目以获取urllogo每个条目吗?

<table border="0" cellspacing="0" cellpadding="2"><tr>
    @configuration.getConfig("social").map { config =>
        @for(item <- config.entrySet) {
           <td><a href="item.getString("url")">
           <img src="@routes.Assets.at("item.getString("logo")").absoluteURL()" width="24" height="24"/></a></td>
        }
    }
</table>
Run Code Online (Sandbox Code Playgroud)

当然,item.getString在上面的片段中不起作用......它只是展示了我想要实现的目标.

最终目标是能够添加任何进一步的社交URL,而无需修改页面模板.

Paw*_*ski 11

如果您将配置更改为:

"social" : [
     {
        name="twitter",
        url="https://twitter.com",
        logo="images/twitter.png"
    },
    {
        name="facebook",
        url="https://www.facebook.com",
        logo="images/facebook.png"
    }
]
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

@(message: String)(implicit request: RequestHeader)
@import play.api.Play.current

<table border="0" cellspacing="0" cellpadding="2"><tr>
    @current.configuration.getConfigList("social").get.map { config =>
            <td><a href="@config.getString("url")">
            <img src="@routes.Assets.at(config.getString("logo").get).absoluteURL()" width="24" height="24"/></a></td>
        }
</table>
Run Code Online (Sandbox Code Playgroud)


Col*_*eld 5

对于后代,这是另一种迭代嵌套配置的方法.我更喜欢这种格式的数组,我宁愿让我的配置比代码更干净.

import collection.JavaConversions._
val socialConfig = ConfigFactory.load.getConfig("social")
socialConfig.root.map { case (name: String, configObject: ConfigObject) => 
    val config = configObject.toConfig
    println(config.getString("url"))
    println(config.getString("logo"))
}
Run Code Online (Sandbox Code Playgroud)

我确信OP可以将其转换为Twirl模板.这就像我能得到它一样干净.


Hai*_*ang 5

如果您使用 Java,则配置如下:

"social" : [
  {
    name="twitter",
    url="https://twitter.com",
    logo="images/twitter.png"
  },
  {
    name="facebook",
    url="https://www.facebook.com",
    logo="images/facebook.png"
  }
]
Run Code Online (Sandbox Code Playgroud)

这会起作用:

ConfigList socials = ConfigFactory().load.getList("social")

for (ConfigValue cv : socials) {
   Config c = ((ConfigObject)cv).toConfig();
   System.out.println(c.getString("url"));
   System.out.println(c.getString("logo"));
}
Run Code Online (Sandbox Code Playgroud)