问题描述
我在 freemarker 模板中尝试了 using both flexjson.JSONSerializer
and com.fasterxml.jackson.databind.ObjectMapper
,将通过 csv 数据加载器 csv(menu.csv,{trimCells: true})
加载的 csv 文件转换为 JSON。
当我尝试运行它时,出现以下异常:
...
Caused by: java.lang.UnsupportedOperationException: Operation supported only on TemplateHashModelEx. fmpp.models.CsvSequence does not implement it though.
at freemarker.ext.beans.HashAdapter.getModelEx(HashAdapter.java:186)
at freemarker.ext.beans.HashAdapter.access$000(HashAdapter.java:38)
at freemarker.ext.beans.HashAdapter$1.iterator(HashAdapter.java:99)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializefields(MapSerializer.java:696)
... 46 common frames omitted
我不知道 FreeMarker 的任何内部结构(目前),但在我看来它像 CsvSequence
does implement the freemarker.template.TemplateHashModel
而不是 freemarker.template.TemplateHashModelEx
。
only place I found getModelEx
is in the HashAdaptor,所以我假设它使用较新的哈希接口。
知道如何解决这个问题吗?
解决方法
CsvSequence
实现了 freemarker.template.TemplateHashModel
和 freemarker.template.TemplateSequenceModel
,参见 http://fmpp.sourceforge.net/api/fmpp/models/CsvSequence.html
CsvSequence 也是一个包含一个键的哈希:标头。这是一个存储头部名称的序列
因为我只想转换序列,而不是标题,我可以简单地将 CsvSequence
转换为正常序列,例如像这样:
${JSON.stringify(csvInput[0..])}
或
${JSON.stringify([] + csvInput)}