2011-05-31 42 views
4

我有一个java.lang.Iterable(实际上是一个com.google.gson.JsonArray实例)。在Freemarker中将java.lang.Iterable当作#list表达式使用

我想使用freemarker(2.3.16)列举列表中的项目。

[#assign sports = controller.sports] 
[#-- At this point, sports is bound to a com.google.gson.JsonArray instance. --] 

[#list sports as sport] 
    ${sport_index} 
[/#list] 

我想避免编写自定义的bean和GSON解串器只是为了有一个项目一个明确的集合。使用Gson(已经将JSON字符串反序列化为JsonObject)然后从该JsonObject创建我自己的DAG对象对我来说似乎很浪费。

不幸的是,我一直无法找到一种让Freemarker将java.lang.Iterable作为列表对待的方法。我得到:

freemarker.template.TemplateException : Expected collection or sequence. 
    controller.sports evaluated instead to freemarker.ext.beans.XMLStringModel on line 8, column 16 in sports.html. 
freemarker.core.TemplateObject.invalidTypeException(line:135) 
freemarker.core.IteratorBlock$Context.runLoop(line:190) 
freemarker.core.Environment.visit(line:417) 
freemarker.core.IteratorBlock.accept(line:102) 
freemarker.core.Environment.visit(line:210) 

回答

5

明确遍历迭代器应该工作,例如:

[#list sports.iterator() as sport] 
    ${sport_index} 
[/#list] 
+0

我以为我已经试过了,但显然不是!谢谢。 – jabley 2011-06-01 09:43:08

+0

我觉得自从这篇文章后我有更好的解决方案,我实际上使用它...但似乎无法找到它并找出它,所以我再次使用它!谢谢! – daniel9x 2017-06-03 00:08:34

1

所有您需要做的就是添加的iterator()结果对你JsonArray上下文。 Freemarker足够聪明,可以从那里处理它,并且您可以在模板中引用它,就像您做任何其他类似列表的变量一样。