首页 > 解决方案 > Coldfusion 使用 ArrayAppend 和 cfloop 创建 Json

问题描述

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

这是 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"
}

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

标签: arraysjsonstructcoldfusion

解决方案


现在,您只返回一个包含项目的数组。将您的函数更改returnTypestruct并修改您的代码,如下所示:

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

推荐阅读