我有一个查询,其中包含包含多个产品的类别。我还根据查询和输出中的类别和产品对其进行了分组。然而,在构造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>
]}你可以看看这里的现场输出。正如您所看到的,逗号甚至在分组产品的末尾,以及在类别组的末尾添加逗号,但我不希望它们出现在那里。我怎么才能解决这个问题?
发布于 2013-11-12 18:34:32
不要滚动您自己的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-12 15:40:48
考虑一种在数组开头跳过逗号的策略。
{"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>
]}https://stackoverflow.com/questions/19932835
复制相似问题