ColdFusion зацикливание на массиве с пустым / неопределенным полем - PullRequest
0 голосов
/ 07 января 2019

Я загружаю данные из API от одного из наших поставщиков. Данные представляют собой массив, но некоторые поля пусты и отображаются как undefined. Я могу вывести большую часть информации с помощью цикла, но когда я добавляю поле «заметки», он завершается с ошибкой:

"Примечания элемента не определены в структуре CFML, на которую ссылаются как на часть выражения. Конкретная последовательность включаемых или обрабатываемых файлов:

C: \ sites \ Fire \ Reports \ xml_parse \ Crewsense_payroll_loop.cfm, строка: 21 "

Когда я смотрю на дамп, я вижу, что поле отображается как "неопределенное". У меня закончились идеи. Любая помощь будет принята с благодарностью. Я включил весь код и ссылку на дамп, показывающий массив.

<cfhttp url="https://api.crewsense.com/v1/payroll? access_token=as;lkdfj;alskdfj;laksdfj&token_type=bearer&start=2019-01-05%2019:00:00&end=2019-01-06%2007:59:00" method="GET" resolveurl="YES" result="result">
</cfhttp>

<cfoutput>

<cfset ApiData = deserializeJSON(result.filecontent)>

<cfset API_ArrayLength = arraylen(ApiData)>

    <cfloop index="i" from="1" to=#API_ArrayLength#>    

    #i# #ApiData[i]["name"]#
        #ApiData[i]["employee_id"]#
        #ApiData[i]["start"]#
        #ApiData[i]["end"]#
        #ApiData[i]["total_hours"]#
        #ApiData[i]["work_type"]#
        #ApiData[i]["work_code"]#
        #ApiData[i]["user_id"]#
        #ApiData[i]["notes"]#  <---Fails here when added--->

        <cfset i = i+1>
    <br>
    </cfloop>   

    <cfdump var="#ApiData#">

</cfoutput>

Dump

1 Ответ

0 голосов
/ 07 января 2019

При работе со структурами данных, которые имеют необязательные элементы, вам необходимо проверить их существование, прежде чем пытаться получить к ним доступ. В противном случае вы получите эту ошибку. Я добавил фрагмент кода с условием if, используя функцию structKeyExists () к вашему коду в качестве примера.

<cfhttp url="https://api.crewsense.com/v1/payroll? access_token=as;lkdfj;alskdfj;laksdfj&token_type=bearer&start=2019-01-05%2019:00:00&end=2019-01-06%2007:59:00" method="GET" resolveurl="YES" result="result">
</cfhttp>

<cfoutput>

    <cfset ApiData = deserializeJSON(result.filecontent)>

    <cfset API_ArrayLength = arraylen(ApiData)>

    <cfloop index="i" from="1" to=#API_ArrayLength#>    

    #i# #ApiData[i]["name"]#
        #ApiData[i]["employee_id"]#
        #ApiData[i]["start"]#
        #ApiData[i]["end"]#
        #ApiData[i]["total_hours"]#
        #ApiData[i]["work_type"]#
        #ApiData[i]["work_code"]#
        #ApiData[i]["user_id"]#
        <cfif structKeyExists(ApiData[i],"notes")>
            #ApiData[i]["notes"]#  <!--- Show 'notes' if it exists --->
        <cfelse>
            'notes' is not available  <!--- Do something here (or not) --->
        </cfif>

        <cfset i = i+1>
        <br>
    </cfloop>   

    <cfdump var="#ApiData#">

</cfoutput>
...