[opencms-dev] JSON array from a list

Tobias Karrer kartobi at gmail.com
Wed Jan 12 19:33:54 CET 2022


Hi!

why don't you use contentload tag?


Something like this (untested though):

<cms:contentload collector="singleFile" 
param="${cms.requestContext.uri}" editable="false">
   <cms:contentaccess var="content"/>
   <c:forEach items="${content.valueList.Item}" var="item" 
varStatus="status">
     {
       "id":"${item.value.Id}",
       "categoria":"${item.value.Category}"
       // ...
     }<c:if test="${not status.last}">,</c:if>
   </c:forEach>
</cms:contentload>


This should work as well:

<c:set var="uri" value="${cms.requestContext.uri}" />
<c:forEach items="${cms.vfs.xml[uri].valueList.Item}" var="item" 
varStatus="status">
     ...
</c:forEach>

BR, Tobias

Am 11.01.2022 um 08:49 schrieb Paoletti Corrado via opencms-dev:
>
> FinecoBank S.p.A. - Internal Use Only
>
> Hi,
>
> finally I have obtain a JSON array without formatter's wrapper div: 
> the JSON is written by template only when I publish file. I know the 
> code is ugly but it works. I hope this may help someone.
>
> <c:if test="${cms.isOnlineProject}">
>
>     <%
>
>     CmsJspActionElement               cms = new 
> CmsJspActionElement(pageContext, request, response);
>
>     CmsObject cmso = cms.getCmsObject();
>
> Locale                                           locale = 
> cms.getRequestContext().getLocale();
>
> String                                            uri = 
> cms.getRequest().getParameter("uri") == null ? 
> cms.getRequestContext().getUri() : cms.getRequest().getParameter("uri");
>
>     CmsResource resourceViaPath = cmso.readResource(uri);
>
>     CmsJspContentAccessBean    res = new CmsJspContentAccessBean(cmso, 
> resourceViaPath);
>
>     // Get xml content file name... (e.g. 
> /.content/newsroomList/newsroomList-00001.xml)
>
> String xmlContentFileName = res.getRawContent().getStringValue(cmso, 
> "Containers[1]/Elements[1]/Uri[1]", locale);
>
>     // ...then I read its content
>
>     CmsResource resourceViaPath2 = cmso.readResource(xmlContentFileName);
>
>     CmsJspContentAccessBean    res2 = new 
> CmsJspContentAccessBean(cmso, resourceViaPath2);
>
>     %>
>
>     [
>
>     <%for(int i=1; i<=res2.getRawContent().getValues("Item", 
> locale).size(); i++) {%>
>
>     {
>
>                "id": 
> "<%=res2.getRawContent().getValue("Item["+i+"]/Id[1]", 
> locale).getStringValue(cmso)%>",
>
>                "categoria": 
> "<%=res2.getRawContent().getValue("Item["+i+"]/Category[1]", 
> locale).getStringValue(cmso)%>",
>
>                "tempoLettura": 
> "<%=res2.getRawContent().getValue("Item["+i+"]/MinReading[1]", 
> locale).getStringValue(cmso)%>",
>
>                "dataPubblicazione": 
> "<%=res2.getRawContent().getValue("Item["+i+"]/Date[1]", 
> locale).getStringValue(cmso)%>",
>
> // ... and so on
>
> }<%if(i<res2.getRawContent().getValues("Item", locale).size()) {%>,<%}%>
>
>     <%}%>
>
>     ]
>
> </c:if>
>
> Corrado
>
> *From:*opencms-dev <opencms-dev-bounces at opencms.org> *On Behalf Of 
> *????????? ?????? ???????
> *Sent:* venerdì 24 dicembre 2021 13:41
> *To:* The OpenCms mailing list <opencms-dev at opencms.org>
> *Subject:* Re: [opencms-dev] JSON array from a list
>
> We do not use formatter at all.
>
> We made jsp file in public part of the site and pasted the code right 
> in jsp file.
>
> We iterate certain content type (NewsBlock) with Solr like this:
>
> <c:set var='solrNewsQuery'>
>
> {
>
> "core" : "Solr Online",
>
> "ignorequery" : true,
>
> "ignoreReleaseDate" : false,
>
> "ignoreExpirationDate" : false,
>
> "queryparam" : ":",
>
> "escapequerychars" : true,
>
> "extrasolrparams" : 
> "fq=parent-folders:\"${searchPath}\"&fq=type:NewsBlock&fq=category:Glavnaya&sort=Newsdate_prop 
> desc",
>
> "pagesize" : "10",
>
> }
>
> </c:set>
>
> <cms:search configString="${solrNewsQuery}" var="search" 
> addContentInfo="true" />
>
> [
>
> <c:forEach var="news" items="${search.searchResults}" varStatus="status">
>
> .....
>
> ------------------------------------------------------------------------
>
> *От:*opencms-dev <opencms-dev-bounces at opencms.org> от имени Paoletti 
> Corrado <c.paoletti at fineco.it>
> *Отправлено:* 24 декабря 2021 г. 15:32
> *Кому:* The OpenCms mailing list
> *Тема:* Re: [opencms-dev] JSON array from a list
>
> FinecoBank S.p.A. - Internal Use Only
>
> Hi,
>
> finally when I publish the file I have JSON! Here the code in JSP 
> formatter:
>
> <%@page 
> import="javax.servlet.http.HttpServletResponse,org.opencms.flex.CmsFlexController,org.apache.commons.lang3.StringEscapeUtils" 
> % 
> <mailto:%25 at page%20import=%22javax.servlet.http.HttpServletResponse,org.opencms.flex.CmsFlexController,org.apache.commons.lang3.StringEscapeUtils%22%20%25>>
>
> <c:if test="${cms.isOnlineProject}">
>
> <%
>
> HttpServletResponse topLevelResponse = 
> CmsFlexController.getController(request).getTopResponse();
>
> topLevelResponse.setHeader("Content-Type","application/json;charset=UTF-8");
>
> topLevelResponse.setHeader("Access-Control-Allow-Origin", "*");
>
> %>
>
> [
>
> <c:forEach var="elem" items="${content.valueList.Item}" 
> varStatus="status">
>
>     <c:set var="Id">${elem.value.Id}</c:set>
>
>     <c:set var="Category">${elem.value.Category}</c:set>
>
>     {
>
>     "id" : 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("Id").toString())%>",
>
>     }${status.last ? "" : ","}
>
> </c:forEach>
>
> ]
>
> </c:if>
>
> The last little thing before perfection... My JSP template has:
>
> <cms:container name="newsroom" type="page" 
> editableby="ROLE.WORKPLACE_USER" maxElements="200">
>
> <h4>Drag here newsroom element</h4>
>
> </cms:container>
>
> so JSON is:
>
> <div  id="newsroom" >
>
> [
>
>     {
>
>     "name" : "giulio",
>
> "surname": "cesare"
>
> },
>
> {
>
> "name" : "dante",
>
> "surname", "alighieri"
>
>     }
>
> ]
>
> </div>
>
> How can I remove the wrapping div?
>
> Many thanks for your help!
>
> Corrado
>
> *From:*opencms-dev <opencms-dev-bounces at opencms.org> *On Behalf Of 
> *????????? ?????? ???????
> *Sent:* giovedì 23 dicembre 2021 13:24
> *To:* The OpenCms mailing list <opencms-dev at opencms.org>
> *Subject:* Re: [opencms-dev] JSON array from a list
>
> We made jsp file and use following code to return news items in json:
>
> <%@page buffer="none" session="false" trimDirectiveWhitespaces="true" %>
>
> <%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms" %>
>
> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
>
> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
>
> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
>
> <%@page 
> import="javax.servlet.http.HttpServletResponse,org.opencms.flex.CmsFlexController,org.apache.commons.lang3.StringEscapeUtils" 
> % 
> <mailto:%25 at page%20import=%22javax.servlet.http.HttpServletResponse,org.opencms.flex.CmsFlexController,org.apache.commons.lang3.StringEscapeUtils%22%20%25>>
>
> <%
>
> HttpServletResponse topLevelResponse = 
> CmsFlexController.getController(request).getTopResponse();
>
> topLevelResponse.setHeader("Content-Type","application/json;charset=UTF-8");
>
> topLevelResponse.setHeader("Access-Control-Allow-Origin", "*");
>
> %>
>
> <c:set var="searchPath">${cms.requestContext.siteRoot}/</c:set>
>
> <c:set var='solrNewsQuery'>
>
> {
>
> "core" : "Solr Online",
>
> "ignorequery" : true,
>
> "ignoreReleaseDate" : false,
>
> "ignoreExpirationDate" : false,
>
> "queryparam" : ":",
>
> "escapequerychars" : true,
>
> "extrasolrparams" : 
> "fq=parent-folders:\"${searchPath}\"&fq=type:NewsBlock&fq=category:Glavnaya&sort=Newsdate_prop 
> desc",
>
> "pagesize" : "10",
>
> }
>
> </c:set>
>
> <cms:search configString="${solrNewsQuery}" var="search" 
> addContentInfo="true" />
>
> [
>
> <c:forEach var="news" items="${search.searchResults}" varStatus="status">
>
> <c:set var="convertId">${news.xmlContent.id}</c:set>
>
> <c:set var="convertTitle">${news.xmlContent.value.Title}</c:set>
>
> <c:set 
> var="convertDescription">${news.xmlContent.value.ShortDescription}</c:set>
>
> <c:set 
> var="convertFullDescription">${news.xmlContent.value.FullDescription}</c:set>
>
> <c:set 
> var="convertPrewImg">https://www.mysite.ru<cms:link>${news.xmlContent.value.ImagePreview}</cms:link></c:set 
> <https://www.mysite.ru%3ccms:link%3e$%7bnews.xmlContent.value.ImagePreview%7d%3c/cms:link%3e%3c/c:set>>
>
> <c:set 
> var="convertUrl">https://www.mysite.ru<cms:link>${news.xmlContent.filename}</cms:link></c:set 
> <https://www.mysite.ru%3ccms:link%3e$%7bnews.xmlContent.filename%7d%3c/cms:link%3e%3c/c:set>>
>
> <fmt:setLocale value="ru-RU"/>
>
> <fmt:timeZone value="GMT+3:00">
>
> <fmt:formatDate type = "both" dateStyle = "long" timeStyle = "long" 
> value = "${cms:convertDate(news.xmlContent.value.Date)}" var="fullDate"/>
>
> <c:set var="formatedDateArray" value='${fn:split(fullDate, " ")}' />
>
> </fmt:timeZone>
>
> <c:set 
> var="convertDate">${formatedDateArray[0]} ${formatedDateArray[1]} ${formatedDateArray[2]}</c:set>
>
> {
>
> "id" : 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertId").toString())%>",
>
> "date" : 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertDate").toString())%>",
>
> "title": 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertTitle").toString())%>",
>
> "short_description": 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertDescription").toString())%>",
>
> "full_description": 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertFullDescription").toString().replaceAll("src=\"","src=\"https://www.mysite.ru 
> <https://www.mysite.ru>").replaceAll("\\<iframe[^>]*> 
> <file://%3ciframe[%5e%3e]*%3e>","").replaceAll("\\<a[^>]*> 
> <file://%3ca[%5e%3e]*%3e>",""))%>",
>
> "url": 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertUrl").toString())%>",
>
> "img": 
> "<%=StringEscapeUtils.escapeEcmaScript(pageContext.getAttribute("convertPrewImg").toString())%>"
>
> }${status.last ? "" : ","}
>
> </c:forEach>
>
> ]
>
> ------------------------------------------------------------------------
>
> *От:*opencms-dev <opencms-dev-bounces at opencms.org> от имени Paoletti 
> Corrado <c.paoletti at fineco.it>
> *Отправлено:* 23 декабря 2021 г. 15:15
> *Кому:* opencms-dev at opencms.org
> *Тема:* [opencms-dev] JSON array from a list
>
> FinecoBank S.p.A. - Internal Use Only
>
> Hi,
>
> my target is to generate a JSON response from a list of users.
>
> With one user <cms:jsonpart generates a correct JSON but when I use it 
> inside a <c:forEach I obtain only the last user so I deduce that 
> <cms:jsonpart is not sufficient.
>
> Searching examples and documentation I find that I could use a 
> combination of JSONArray and JSONObject and these objects are defined 
> in cms taglibrary 
> (https://documentation.opencms.org/javadoc/tld/cms/jsonarray.html)
>
> So, I have write <cms:jsonarray but I have:
>
> No tag "jsonarray" defined in tag library imported with prefix "cms"
>
> Someone could suggest me the right way to follow to have a JSON array 
> like this:
>
> [
>
> {"name":"giulio", "surname":"cesare"},
>
> {"name":"dante", "surname":"alighieri"},
>
> ]
>
> Another approach is to use Java (I am not Java programmer) so I have 
> wrote:
>
> <%@page import="org.opencms.json.JSONException, 
> org.opencms.json.JSONArray, org.opencms.json.JSONObject"% 
> <mailto:%25 at page%20import=%22org.opencms.json.JSONException,%20org.opencms.json.JSONArray,%20org.opencms.json.JSONObject%22%25>>
>
> <%
>
> JSONObject user = new JSONObject();
>
> try {
>
> user.put("name", "giulio");
>
> user.put("surname", "cesare");
>
> } catch (JSONException e) {
>
> }
>
> JSONArray userList = new JSONArray();
>
> userList.put(user);
>
> System.out.println( userList );
>
> %>
>
> but nothing happens.
>
> Kind regards and Happy Christmas.
>
> Corrado
>
>
> _______________________________________________
> This mail is sent to you from the opencms-dev mailing list
> To change your list options, or to unsubscribe from the list, please visit
> https://lists.opencms.org/mailman/listinfo/opencms-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opencms.org/pipermail/opencms-dev/attachments/20220112/6d35832d/attachment.htm>


More information about the opencms-dev mailing list