如何在FreeMarker中序列化()fmpp-CsvSequence



我尝试在freemarker模板中同时使用flexjson.JSONSerializercom.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.TemplateHashModelfreemarker.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}

相关内容

  • 没有找到相关文章