在对cfoutput进行分组时,在cfoutput的末尾添加逗号

时间:2013-11-12 15:13:41

标签: mysql api coldfusion

我的查询包含其中包含多个产品的类别。我根据查询和输出中的类别和产品对其进行了分组。但是,在构建API代码时,我遇到了它们之间的逗号问题。到目前为止,我到处都有逗号,但我不想在类别或产品组的末尾添加逗号。这是查询:

    SELECT P.PRODUCT_ID,P.PRODUCT_NAME,PC.PRODUCT_CAT,PC.PRODUCT_CATID,PR.PRICE,PR.MONEY,PC.HIERARCHY
    FROM PRODUCT_CAT PC 
    LEFT OUTER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    LEFT OUTER JOIN PRICE PR ON P.PRODUCT_ID=PR.PRODUCT_ID
    WHERE P.IS_SALES=1 AND P.IS_EXTRANET=1 AND PR.PRICE IS NOT NULL

    GROUP BY PC.HIERARCHY,PC.PRODUCT_CAT,P.PRODUCT_ID,P.PRODUCT_NAME,PC.PRODUCT_CATID,PR.PRICE,PR.MONEY
    ORDER BY PC.HIERARCHY,P.PRODUCT_NAME

和我的输出:

{"status":"ok","count":<cfoutput>#row#</cfoutput>,"data":[
    <cfoutput query="get_json" group="product_catid">
        {"cat":#product_cat#,"cat_id":#product_catid#,"products":[
            <cfoutput group="product_id">
                {"id":#product_id#,"name":#product_name#,"price":#tlformat(price,2)#,"currency":#money#},<!-- i dont want this comma to be added in the end of the products group --->
            </cfoutput>
        ]},<!-- i dont want this comma to be added in the end of the categories group --->
    </cfoutput>
    ]}

您可以查看the live output of it here。正如您所看到的,即使在分组产品的最后,也可以在最后,类别组的末尾添加逗号,但我不希望它们存在。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

不要滚动自己的JSON。有许多现有选项可以完成更彻底的工作,并正确处理值中嵌入的特殊字符(您当前的代码没有)。只需创建必要的CF结构并使用serializeJSON。当然,CF实现有一些怪癖,所以你也可以考虑使用JSON projects on github.com之一。无论哪种方式,它都比自己做的好。

无论如何,在您的情况下,data元素只是结构[]的数组{}。每个结构代表一个类别,其中包含一个products数组。

    { 
       "data":[   <--- array --->
                 {"cat":xxx,  "products":[ <!--- array of products --->], ... }
                , {"cat":yyy, "products":[ <!--- array of products --->], .. }
              ]
    } 

要创建元素,只需在循环之前初始化数据数组:

<cfset dataArray = []>

在外部循环内,为每个类别创建一个结构:

<cfoutput query="get_json" group="product_catid">
    <!--- create new category structure --->
    <cfset category = {}>
    <cfset category["cat"]= product_cat>
    .... other keys ....
    <cfset category["products"] = []> 
    ...

内部循环中,创建产品并将其添加到您的类别中:

<cfoutput group="product_id">
    <!--- create new product element --->
    <cfset prod = {}>
    <cfset prod ["id"] = product_id>
    ... other keys ...

    <!--- save product to your category --->
    <cfset arrayAppend(category.products, product)>
</cfoutput>

然后在关闭循环之前,将类别保存到dataArray

     <!--- save to data array --->
     <cfset arrayAppend(dataArray, category)>

  </cfoutput>

最后,结束状态和数据,并将其序列化:

  <cfset result = {}>
  <cfset result["status"] = "ok">
  <cfset result["count"] = row>
  <cfset result["data"] = dataArray>

  <!--- debug serialized results --->
  <cfdump var="#serializeJSON( result )#">

答案 1 :(得分:1)

考虑一种在数组开头跳过逗号的策略。

{"status":"ok","count":<cfoutput>#row#</cfoutput>,"data":[
<cfoutput query="get_json" group="product_catid">
    {"cat":#product_cat#,"cat_id":#product_catid#,"products":[
       <cfif currentrow GT 1>,</cfif>
       <cfset innercomma = 0>
       <cfoutput group="product_id">
         <cfif innercomma EQ 1>,</cfif>
         <cfset innercomma = 1>
 {"id":#product_id#,"name":#product_name#,"price":#tlformat(price,2)#,"currency":#money#}
       </cfoutput>
    ]}
</cfoutput>
]}