arrays - 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"
}
我希望我的问题是可读的,如果有人有建议,我将不胜感激。
解决方案
现在,您只返回一个包含项目的数组。将您的函数更改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>
- 我曾经
...
跳过一些代码。 - 对结构使用括号表示法(like
response["customer"]
)将保证键的大小写,而使用点表示法(likeresponse.customer
)可能会导致"CUSTOMER":
稍后序列化。 arrayAppend(array, element)
是array.add(element)
(所有CF版本)的丑陋版本,即array.append(element)
(CF2016+)
推荐阅读
- firebase - 如何在 Flutter 中从 Firestore 获取值
- c++ - C 和 C++ 中数据类型的大小
- typescript - 从任意数量的闭包中获取最后一个函数的类型
- javascript - 为什么当我将 QuillJS setContent 设置为 JSON 对象时不显示任何内容?
- c# - 有没有办法通过 .NET 客户端库检索 Azure DevOps 选项列表信息?
- git - 在创建存储库的本地副本时克隆 AWS 代码提交存储库时出现以下错误
- c++ - 给定一个仅由 '(' 和 ')' 组成的字符串 S,找出最长有效子字符串的长度
- r - 创建包含复合条形图和堆叠条形图的条形图
- python - 在 OSMnx 中使用实时数据动态调整边缘“成本”?
- blazor-client-side - 如何在 blazor navigateTo 中将复杂对象作为参数传递