将java.lang.Iterable视为Freemarker中的#list表达式

jab*_*ley 4 java iterable freemarker list

我有一个java.lang.Iterable(实际上是一个com.google.gson.JsonArray实例).

我想使用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]
Run Code Online (Sandbox Code Playgroud)

我想避免编写自定义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)
Run Code Online (Sandbox Code Playgroud)

Cha*_*tay 5

显式循环遍历迭代器应该有效,例如:

[#list sports.iterator() as sport]
   ${sport_index}
[/#list]
Run Code Online (Sandbox Code Playgroud)