我尝试在freemarker模板中同时使用flexjson.JSONSerializer
和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
确实实现了freemarker.template.TemplateHashModel
,但没有实现freemarker.template.TemplateHashModelEx
。
我发现getModelEx
的唯一位置是在HashAdaptor中,所以我认为它使用了较新的散列接口。
知道怎么解决这个问题吗?
CsvSequence
同时实现freemarker.template.TemplateHashModel
和freemarker.template.TemplateSequenceModel
,请参阅http://fmpp.sourceforge.net/api/fmpp/models/CsvSequence.html
CsvSequence也是一个包含一个键的散列:headers。这是一个存储标题名称的序列
由于我只想转换序列,而不是标头,我可以简单地将CsvSequence
转换为正常序列,例如:
${JSON.stringify(csvInput[0..])}
或
${JSON.stringify([] + csvInput)}
您也可以手动转换:
<#assign header = _responses["getCSV"]["rawBody"]?keep_before('rn')?split(_variables["textquoter"]+_variables["commaseperator"]+_variables["textquoter"])>
<#assign data = _responses["getCSV"]["rawBody"]?keep_after('rn')?replace('rn',_variables["textquoter"]+_variables["commaseperator"]+_variables["textquoter"])?split(_variables["textquoter"]+_variables["commaseperator"]+_variables["textquoter"])>
<#if data[data?size-1] = ''><#assign data = data[0..data?size-2]></#if>
<#assign json>
<#compress>
[
<#list data as X>
<#assign mod = (X?index) % (header?size)>
<#if mod = 0>{</#if>
"${header[mod]?remove_beginning(_variables["textquoter"])?remove_ending(_variables["textquoter"])}" : "${X?remove_beginning(_variables["textquoter"])?remove_ending(_variables["textquoter"])}"<#if mod lt header?size-1>,</#if>
<#if mod = header?size-1>},</#if>
</#list>
</#compress>
</#assign>
<#assign json = json?remove_ending(',') + 'n]'>
${json}