<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: JSON array evaluating to StringModel in FreeMarker in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310563#M263693</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I have a very similar problem, with the same error.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But in my case I am trying to use a javascript-based webscript.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To take the same example as Stuart Layland, but converted to javascript (The FTL is the same.):&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;javascript&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var connector = remote.connect("alfresco-webscripts");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var webscriptUrl = "/mySearch?query=" + args.query;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var data = connector.get(webscriptUrl);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;logger.log(data);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;model.results = eval(data);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/javascript&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But I get the error: freemarker.template.TemplateException: Expected collection or sequence. results evaluated instead to freemarker.ext.beans.StringModel on line 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is it not possible to directly pass the eval'd object to the template model?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Do I really need to create a Java-based webscript for this?&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 19 May 2016 16:18:04 GMT</pubDate>
    <dc:creator>sorin_postelnic</dc:creator>
    <dc:date>2016-05-19T16:18:04Z</dc:date>
    <item>
      <title>JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310560#M263690</link>
      <description>Hello,I have a web script in Share that calls a repo web script which returns some JSON. I want to use this JSON in a FreeMarker template to build up a page but I'm having some problems. The repo side seems to be working absolutely fine. Here is an example of the JSON it returns:[{"Name":"Matrix - C</description>
      <pubDate>Fri, 31 Oct 2014 09:57:40 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310560#M263690</guid>
      <dc:creator>stuartleyland</dc:creator>
      <dc:date>2014-10-31T09:57:40Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310561#M263691</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hello,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;the problem with this is that JSONArray is by default not a supported data type to put into the model for the template processor. You should use proper array, List or Collection values when you populate the model in Java. Any unsupported data type will result in the template processor to convert the object into StringModel via its toString() operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Axel&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 31 Oct 2014 12:52:53 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310561#M263691</guid>
      <dc:creator>afaust</dc:creator>
      <dc:date>2014-10-31T12:52:53Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310562#M263692</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Brilliant! Thanks so much that fixed my problem. My working code is listed below for others who have the same problem in the future.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;&lt;BR /&gt;package com.x.y.z;&lt;BR /&gt;&lt;BR /&gt;import java.util.ArrayList;&lt;BR /&gt;import java.util.HashMap;&lt;BR /&gt;import java.util.List;&lt;BR /&gt;import java.util.Map;&lt;BR /&gt;&lt;BR /&gt;import org.alfresco.error.AlfrescoRuntimeException;&lt;BR /&gt;import org.alfresco.util.ParameterCheck;&lt;BR /&gt;import org.apache.commons.lang3.StringUtils;&lt;BR /&gt;import org.json.JSONArray;&lt;BR /&gt;import org.json.JSONException;&lt;BR /&gt;import org.json.JSONObject;&lt;BR /&gt;import org.springframework.extensions.surf.RequestContext;&lt;BR /&gt;import org.springframework.extensions.surf.ServletUtil;&lt;BR /&gt;import org.springframework.extensions.surf.exception.ConnectorServiceException;&lt;BR /&gt;import org.springframework.extensions.surf.support.ThreadLocalRequestContext;&lt;BR /&gt;import org.springframework.extensions.webscripts.Cache;&lt;BR /&gt;import org.springframework.extensions.webscripts.DeclarativeWebScript;&lt;BR /&gt;import org.springframework.extensions.webscripts.Status;&lt;BR /&gt;import org.springframework.extensions.webscripts.WebScriptException;&lt;BR /&gt;import org.springframework.extensions.webscripts.WebScriptRequest;&lt;BR /&gt;import org.springframework.extensions.webscripts.WebScriptSession;&lt;BR /&gt;import org.springframework.extensions.webscripts.connector.Connector;&lt;BR /&gt;import org.springframework.extensions.webscripts.connector.Response;&lt;BR /&gt;&lt;BR /&gt;public class ShareWebScript extends DeclarativeWebScript {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected Map&amp;lt;String,Object&amp;gt; executeImpl(WebScriptRequest req, Status status) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return executeImpl(req, status, null);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected Map&amp;lt;String, Object&amp;gt; executeImpl(WebScriptRequest req, Status status, Cache cache) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String, Object&amp;gt; model = new HashMap&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final RequestContext rc = ThreadLocalRequestContext.getRequestContext();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String userId = rc.getUserId();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final Connector conn = rc.getServiceRegistry().getConnectorService().getConnector("alfresco", userId, ServletUtil.getSession());&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final String url = "/mySearch?query=" + query;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final Response response = conn.call(url);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (response.getStatus().getCode() == Status.STATUS_OK) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JSONArray resultsResponse = new JSONArray(response.getResponse());&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; resultsResponse.length(); i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JSONObject result = resultsResponse.getJSONObject(i);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String, String&amp;gt; resultObject = new HashMap&amp;lt;&amp;gt;();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String title = result.getString("Name");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultObject.put("ShareTitle", title);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String problem = result.getString("Problem");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultObject.put("ShareProblem", problem);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;results.add(resultObject);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.put("results", results);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (final ConnectorServiceException e)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new AlfrescoRuntimeException("Failed to connect repository", e);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (final JSONException e)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new AlfrescoRuntimeException("Failed to parse JSON string", e);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return model;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And this is the FTL.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;&lt;BR /&gt;&amp;lt;#escape x as jsonUtils.encodeJSONString(x)&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Results" : [&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;#list results as result&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Title" : "${result.ShareTitle}",&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Problem : "${result.ShareProblem}"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/#list&amp;gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR /&gt;&amp;lt;/#escape&amp;gt;&lt;BR /&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks again, much appreciated.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 31 Oct 2014 14:41:56 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310562#M263692</guid>
      <dc:creator>stuartleyland</dc:creator>
      <dc:date>2014-10-31T14:41:56Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310563#M263693</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I have a very similar problem, with the same error.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But in my case I am trying to use a javascript-based webscript.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To take the same example as Stuart Layland, but converted to javascript (The FTL is the same.):&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;javascript&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var connector = remote.connect("alfresco-webscripts");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var webscriptUrl = "/mySearch?query=" + args.query;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var data = connector.get(webscriptUrl);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;logger.log(data);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;model.results = eval(data);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/javascript&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But I get the error: freemarker.template.TemplateException: Expected collection or sequence. results evaluated instead to freemarker.ext.beans.StringModel on line 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is it not possible to directly pass the eval'd object to the template model?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Do I really need to create a Java-based webscript for this?&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 19 May 2016 16:18:04 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310563#M263693</guid>
      <dc:creator>sorin_postelnic</dc:creator>
      <dc:date>2016-05-19T16:18:04Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310564#M263694</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Apart from the fact that you should avoid eval() altogether and instead use something like JSON.parse() to avoid code injection issues, you should be able to pass native JS objects / arrays into the model. The default integration of the Rhino JavaScript engine into web scripts should ensure that data put into model is converted from JS to Java (and if necessary + supported to specific FTL types).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now since I don't know about the expected JSON structure that you parse I can't know if some fluke error in the JSON can result in the eval() to just return a String instead of an array you expected…&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 May 2016 07:38:43 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310564#M263694</guid>
      <dc:creator>afaust</dc:creator>
      <dc:date>2016-05-20T07:38:43Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310565#M263695</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Dear Axel, Thank you for your reply.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In the meantime I tried to do in javascript the operation of "manually" converting the model to javascript objects, like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;javascript&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var connector = remote.connect("alfresco-webscripts");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var webscriptUrl = "/mySearch?query=" + args.query;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var response = connector.get(webscriptUrl);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var data = eval(response);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;logger.log(data);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;var results = [];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;for (var i=0,n=data.length; i&amp;lt;n; i++) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; var item = data&lt;/SPAN&gt;&lt;EM&gt;;&lt;BR /&gt;&amp;nbsp; results.push({"id":item.id, "name":item.name, "title":item.title});&lt;BR /&gt;}&lt;BR /&gt;model.results = results;&lt;BR /&gt;&amp;lt;/javascript&amp;gt;&lt;BR /&gt;&lt;BR /&gt;But it was not working –&amp;gt; the results were an empty array, because data.length was undefined.&lt;BR /&gt;&lt;BR /&gt;Later I dropped the eval call and replaced it with jsonUtils.toObject(data)&lt;BR /&gt;But then I started getting errors like: org.mozilla.javascript.EcmaError: TypeError: Cannot find function length.&lt;BR /&gt;&lt;BR /&gt;While debugging this, something not at all helpful (and one of the most annoying) was the fact that I cannot perform operations like:&lt;BR /&gt;&amp;lt;javascript&amp;gt;&lt;BR /&gt;var a = jsonUtils.toObject('{"a":123}');&lt;BR /&gt;logger.log(a);&amp;nbsp; // ==&amp;gt; org.mozilla.javascript.EcmaError: TypeError: Cannot find default value for object.&lt;BR /&gt;logger.log(typeof a);&amp;nbsp; // ==&amp;gt; "object"&amp;nbsp;&amp;nbsp; What kind of object?? What fields and methods does it have??&lt;BR /&gt;&amp;lt;/javascript&amp;gt;&lt;BR /&gt;&lt;BR /&gt;In the end I removed the "manual" re-assignment, and now it's working with just this:&lt;BR /&gt;&amp;lt;javascript&amp;gt;&lt;BR /&gt;var connector = remote.connect("alfresco-webscripts");&lt;BR /&gt;var webscriptUrl = "/mySearch?query=" + args.query;&lt;BR /&gt;var response = connector.get(webscriptUrl);&lt;BR /&gt;var data = jsonUtils.toObject(response);&lt;BR /&gt;model.results = data.results;&lt;BR /&gt;&amp;lt;/javascript&amp;gt;&lt;BR /&gt;&lt;BR /&gt;Note that in order to make it work I had to also change the FTL for my AlfrescoRepo data-webscript, which was returning a JSON Array:&lt;BR /&gt;&amp;lt;javascript&amp;gt;&lt;BR /&gt;[&lt;BR /&gt;{"id":"1","name":"John","Title":"Johnny"},&lt;BR /&gt;{"id":"2","name":"Jane","Title":"Jenny"},&lt;BR /&gt;]&lt;BR /&gt;&amp;lt;/javascript&amp;gt;&lt;BR /&gt;&lt;BR /&gt;I was getting the following error from jsonUtils.toObject(response): org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject&lt;BR /&gt;&lt;BR /&gt;I had to change it to return a JSON Object, like this:&lt;BR /&gt;&amp;lt;javascript&amp;gt;&lt;BR /&gt;{"results":[&lt;BR /&gt;{"id":"1","name":"John","Title":"Johnny"},&lt;BR /&gt;{"id":"2","name":"Jane","Title":"Jenny"},&lt;BR /&gt;]}&lt;BR /&gt;&amp;lt;/javascript&amp;gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 20 May 2016 14:15:03 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310565#M263695</guid>
      <dc:creator>sorin_postelnic</dc:creator>
      <dc:date>2016-05-20T14:15:03Z</dc:date>
    </item>
    <item>
      <title>Re: JSON array evaluating to StringModel in FreeMarker</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310566#M263696</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Really amazing and impressive sharing thanks&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.buzzapplications.com/website-design-services/" rel="nofollow noopener noreferrer"&gt;web design service&lt;/A&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 21 Jul 2016 11:09:00 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/json-array-evaluating-to-stringmodel-in-freemarker/m-p/310566#M263696</guid>
      <dc:creator>risharommi</dc:creator>
      <dc:date>2016-07-21T11:09:00Z</dc:date>
    </item>
  </channel>
</rss>

