我的查询包含其中包含多个产品的类别。我根据查询和输出中的类别和产品对其进行了分组。但是,在构建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。正如您所看到的,即使在分组产品的最后,也可以在最后,类别组的末尾添加逗号,但我不希望它们存在。我该如何解决这个问题?
答案 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>
]}