2

我有一个查询,其中包含多个产品的类别。我也在查询和输出中根据类别和产品对其进行分组。但是,在构建 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>
    ]}

您可以在这里查看它的实时输出。如您所见,即使在分组产品的末尾以及最后,在类别组的末尾也添加了逗号,但我不希望它们在那里。我怎样才能解决这个问题?

4

2 回答 2

3

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

无论如何,在您的情况下,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 )#">
于 2013-11-12T18:34:32.627 回答
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>
]}
于 2013-11-12T15:40:48.407 回答