Coldfusion 使用 ArrayAppend 和 cfloop 创建 Json

Coldfusion create Json with ArrayAppend & cfloop

我正在尝试创建一个 JSON 结构以将 API 发送给墨西哥发票提供商 (cfdi 3.3)。我已经有一个带有项目值的函数,带有 cfloop。问题是我不知道如何在相同的结构中插入不在数组"Items:"内的其他值,例如payment_type,客户等

这是API请求的例子


curl https://www.facturapi.io/v1/invoices \
  -u "sk_test_API_KEY:" \
  -H "Content-Type: application / json" \
  -d '{
    "customer": "58e93ionede86eb318b0197456",
    "items": [{
      "quantity": 2,
      "product": "58e93ionede86eb318b0197454"
    }],
    "payment_form": "06",
    "folio_number": 914,
    "series": "A"
  } '

我想得到这样的结构:

{
  "customer": "77e93ionede86eb318b0197456",
  "items": [
    {
      "quantity": 2,
      "product": "99e93etimee86eb318b0191111"
    },
    {
      "quantity": 5,
      "product": "88e55etimee86eb999b0192222"
    }
  ],
  "payment_form": "06",
  "folio_number": 914,
  "series": "A"
}

这是我的代码 (cffunction)


<cfcomponent>
    <cfset #dsnvtasmart# = "popmart">

    <cffunction name="result" access="remote" 
            returntype="array"
            returnformat="JSON" 
            hint="it is the text">

         <cfset #dsnvtasmart# = "popmart">
         <cfquery name="qProd" datasource="#dsnvtasmart#">
            SELECT det_ordenp.cant AS quantity
                    , det_ordenp.api_id_prod AS product
            FROM    det_ordenp
            WHERE   det_ordenp.id_orden = #worden#
         </cfquery>

        <!--- 
            **---Other values Json Struct.--------**
        --->    
        <cfset customer =#77e93ionede86eb318b0197456#>
        <cfset payment_form = '06'>
        <cfset folio_number = 914>
        <cfset series = 'A'>

        <cfloop query="qProd">
            <cfset var empStruct = {"quantity":#qProd.quantity#, "product":#qProd.product#}>
            <cfset arrayAppend (result, empStruct)>
        </cfloop>

        <cfreturn result>
   </cffunction>
</cfcomponent>

目前,使用这段代码,我只得到:

[
  {
    "quantity": 6,
    "product": "5d5307eb8a6ce057e78b32be"
  },
  {
    "quantity": 37,
    "product": "5d53080d8a6ce057e78b32c0"
  }
]

我不知道如何在 empStruct 中包含 :

的值
{
  "customer": "77e93ionede86eb318b0197456",
  "payment_form": "06",
  "folio_number": 914,
  "series": "A"
}

我希望我的问题是可读的,如果有人有建议,我将不胜感激。

现在,您只返回一个包含项目的数组。将函数的 returnType 更改为 struct 并像这样修改代码:

<cffunction ... returnType="struct" returnFormat="JSON">

        ...
    </cfquery>

    <cfset var response             = {}>
    <cfset response["customer"]     = "77e93ionede86eb318b0197456">
    <cfset response["items"]        = []>
    <cfset response["payment_form"] = "06">
    <cfset response["folio_number"] = 914>
    <cfset response["series"]       = "A">

    <cfloop query="qProd">
        <cfset var item = {}>
        <cfset item["quantity"] = qProd.quantity>
        <cfset item["product"]  = qProd.product>
        <cfset arrayAppend(response["items"], item)>
    </cfloop>

    <cfreturn response>
</cffunction>
  • 我用 ... 跳过了一些代码。
  • 对结构使用括号表示法(如response["customer"])将保证键的大小写,而使用点表示法(如response.customer)可能会导致序列化为"CUSTOMER": 稍后。
  • arrayAppend(array, element)array.add(element) 的丑化版本(所有 CF 版本),即 array.append(element) (CF2016+)