Coldfusion 10-在从SendGrid返回的JSON结构上循环

Coldfusion 10-在从SendGrid返回的JSON结构上循环,coldfusion,coldfusion-10,sendgrid,Coldfusion,Coldfusion 10,Sendgrid,SendGrid正在将eventhook系统更改为将JSON发布到网页。当数据被反序列化时,它是一个数组集合,每个数组包含基于事件的可能不同的键。我需要根据事件处理并向电子邮件跟踪数据库添加条目,其中包含的数据是数组或数组中的数组 我正在寻找一种有效处理这些返回数组的方法。我最初的想法是使用“event”作为表达式执行cfswitch。如果我知道一个event=bounched,我就知道数组中还有哪些其他键 虽然我确信这会起作用,但我想知道是否有更好的方法或途径代替为8个返回不同数组的不同事件创

SendGrid正在将eventhook系统更改为将JSON发布到网页。当数据被反序列化时,它是一个数组集合,每个数组包含基于事件的可能不同的键。我需要根据事件处理并向电子邮件跟踪数据库添加条目,其中包含的数据是数组或数组中的数组

我正在寻找一种有效处理这些返回数组的方法。我最初的想法是使用“event”作为表达式执行cfswitch。如果我知道一个event=bounched,我就知道数组中还有哪些其他键

虽然我确信这会起作用,但我想知道是否有更好的方法或途径代替为8个返回不同数组的不同事件创建开关/案例


我会将代码划分成一个对象,该对象可以确定应该/不应该做什么。所以你会有这样的想法:

<cfcomponent displayname="SendGridProcessor">

    <cffunction name="processEvent" access="public" returntype="void" output="false">
        <cfargument name="EventData" type="struct" required="true" />

        <cfswitch expression="#Arguments.EventData.Event#">

            <cfcase value="processed">
                <cfset processEventProcessed( Arguments.EventData ) />
            </cfcase>

            <cfcase value="dropped">
                <cfset processEventDropped( Arguments.EventData ) />
            </cfcase>

        </cfswitch>

    </cffunction>

    <cffunction name="processEventProcessed" access="private" output="false" returntype="void">
        <cfargument name="EventData" type="struct" required="true" />
        <!--- do your processing --->
    </cffunction>

    <cffunction name="processEventDropped" access="private" output="false" returntype="void">
        <cfargument name="EventData" type="struct" required="true" />
        <!--- do your processing --->
    </cffunction>

</cfcomponent>


这使您可以在循环事件时调用单个方法,并且可以根据从SendGrid传递的事件轻松地分离逻辑。

您可以使用三元运算符检查变量的存在性。例如
email=structKeyExists(i,'email')?i、 电子邮件:''
这是一个很好的方法。只要将单个操作的逻辑封装在单独的函数中,使用switch/case本质上没有什么错误。此外,为了获得最大的可用性,您可能希望为每个函数定义单个参数,而不是单个参数(结构)。调用函数时,使用
argumentCollection
将结构键作为单个参数传递。ie
processEventDropped(argumentCollection=Arguments.EventData)