2015-08-12 3 views
2

Я тестирую приложение под названием «Сканер штрих-кода» для своего бизнеса; Я хочу использовать его в качестве замены сортировки для тайм-слова.JSON/CFML - Зацикливание по массиву структур

Сотрудники могут сканировать штрих-код или QR-код на свой идентификационный значок, и это приложение отправит это вместе с меткой времени и даже координатами GPS на мой сервер, чтобы убедиться, что они находятся в нужном месте в нужное время. Когда у телефона есть подключение к Интернету, эта информация передается через специальный URL-адрес на моем сайте, и я могу заставить его работать безупречно.

Проблема?

Когда нет Интернета, телефон сохраняет сканирование локально, и вы можете отправить его на свой сервер позже. Эти проверки хранятся в виде массива JSON структур.

According to the documentation

... Данные хранятся таким образом, могут быть отправлены на сервер как запрос POST. Я не знал, как проверить все это, поэтому я просто установил некоторые переменные, выполнил сканирование и отправил мне электронное письмо, которое сбросило значения, которые они представляли.

<cfset requestBody = toString(getHttpRequestData().content)/> 

Вернул этот чудовище и многие другие; то, что вы видите ниже, - это одно сканирование.

партия =% 5B% 7B% 22barcode% 22% 3A% 22CSS1959% 22% 2C% 22scannerID% 22% 3A% 223e81b04aa521a05e% 22% 2C% 22time% 22% 3A% 222015-08-11 + 08 % 3A28% 3A20.419% 22% 2C% 22lat% 22% 3A32.3999433% 2C% 22long% 22% 3A-110,040379% 7D% 5D

Так я побежал это значение с помощью функции URLDecode() к получить то, что выглядит более знакомым.

<cfset decodedBody = #URLDecode(requestBody)#> 
<!--- This would output the following. Line breaks are for ease of reading. ---> 
batch=[{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e", 
"time":"2015-08-11 08:28:20.419","lat":32.3999433,"long":-110.040379}] 

Так в конце концов я имел кучу сканов, образовавших этот массив структур в формате JSON, и я понятия не имею, как справиться с этим.

batch=[ 
{"barcode":"CSS1035","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:27.232","lat":32.4001579,"long":-110.0403455}, 
{"barcode":"CSS1959","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:29.366","lat":32.4001579,"long":-110.0403455}, 
{"barcode":"CSS1649","scannerID":"3e81b04aa521a05e","time":"2015-08-11 08:30:31.642","lat":32.4001579,"long":-110.0403455} 
] 

Я ПЫТАЮСЬ, чтобы пройти через него и вставить их все в базу данных.

До сих пор у меня есть это, и я получаю ошибку синтаксического анализа JSON.

<cfset requestBody = toString(getHttpRequestData().content) /> 
<cfset decodedBody = #URLDecode(requestBody)#> 
<!---This is where I falter because I have no idea how to handle it.---> 
<cfset arrayOfStructs = deserializeJson(decodedBody)> 
<cfloop array="#arrayOfStructs#" index="barcode"> 
blah blah query logic 
</cfloop> 

Вот ошибка, которую я получаю. enter image description here

Спасибо!

EDIT: Решено спасибо частично, чтобы помочь мне получить здесь. Решение ниже:

<cfset requestBody = #replaceNoCase(toString(getHttpRequestData().content), "batch=", "")# /> 
<cfset decodedBody = #URLDecode(requestBody)#> 
<cfset ArrayOfStructs = deserializeJson(decodedBody)> 
<cfloop array="#ArrayOfStructs#" index="i"> 
<cfquery name="doodoodoo" datasource="CRM"> 
    INSERT INTO TimeAppTest 
    (
     EmployeeID, 
     lat, 
     long, 
     TimoStampo 
     ) 
    VALUES 
    (
     '#i.barcode#', 
     '#i.lat#', 
     '#i.long#', 
     '#i.time#' 

     ) 
</cfquery> 
</cfloop> 
+0

Обратите внимание, что, несмотря на название этого сообщения, это не имеет ничего общего с циклом над чем-либо, а вместо синтаксического анализа строки JSON. Фактически, вся почта могла быть сведена к нулю, кроме декодированной строки JSON, и предложение, предлагающее десериализовать его. –

+0

Я подумал, что могу смутить некоторых людей. Факт: у меня нет большого опыта работы с JSON, и я решил, что могу превратить его в объект запроса или что-то в этом роде. Всегда учись! – TRose

+2

Технически вы можете преобразовать его в запрос, но в действительности нет необходимости. Ваш первый инстинкт был правильным. Просто десериализуйте его в массивы и структуры. Затем перебираем массив. Нет необходимости в объекте запроса. – Leigh

ответ

3

Мне кажется, что вы можете иметь возможность получить доступ к значению «пакет» непосредственно как часть области формы. Предполагая, что вы действительно получаете почтовый запрос.

Таким образом, вы можете также быть в состоянии просто сделать:

<cfif isDefined("form.batch")> 
    <cfset aData = deSerializeJSON(trim(form.batch))> 
    <cfdump var="#aData#"> 
</cfif> 

поэтому нет необходимости смотреть на теле запроса, и нет необходимости декодировать ответ.

+0

Я закончил писать что-то, чтобы соответствовать ответу Брэда Вуда (он просто первым ответил), но это также прекрасно работает, и бонусные баллы за то, что они просты! – TRose

2

Вы либо должны сдирать «партию =» или передать всю вещь в «оценить()», который будет установлен массив литерал в переменную под названием партии. Я бы порекомендовал бывшую опцию, так как вторая могла быть использована вредоносным содержимым CFML в строке.

<cfset arrayOfStructs = deserializeJson(replaceNoCase(decodedBody, "batch=", ""))>