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 プロジェクトの 1 つを使用することを検討することもできます。いずれにせよ、自分でやるよりはましです。

とにかく、あなたの場合、要素は単なる構造体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 に答える