Coldfusion Lucee 4.5.2.018 (Linux) — служба REST (не может преобразовать строку) JSON

работая над веб-сервисом REST, у меня нет большого опыта работы с веб-сервисами coldfusion. Это очень простой веб-сервис. Пожалуйста, если вы, ребята, можете указать мне, что я делаю неправильно. это будет большим подспорьем.

Сервер приложений: Lucee 4.5.2.018 (Linux)

Пожалуйста, найдите ниже мой код.

Компонент-Функция/Веб-Сервис.

<cfcomponent rest="true" restpath="/hello">

    <cffunction name="formPost" access="remote" returnType="struct" httpMethod="POST" restPath="/name" hint="POST Method" produces="application/json">
           <cfargument name="firstname" type="String" restArgSource="Form">
           <cfargument name="lastname" type="String" restArgSource="Form">
         <cfset myStruct =  structnew()>  
           <cfset myStruct.FirstName = firstname>
           <cfset myStruct.LastName  = lastname>

            <cfquery name="Qry" datasource="myDSN">
                select col1,col2 from myTableData
            </cfquery>
           <cfset myJsonVar = serializeJSON(Qry) />
           <cfreturn myJsonVar>
    </cffunction>
</cfcomponent>

Вызов веб-сервиса

<cfhttp url="http://mydev:8888/rest/Example/hello/name" method="POST"  result="res"  port="8888" >
        <cfhttpparam type="header" name="Accept" value="application/json">
        <cfhttpparam type="formfield" name="firstname" value="Dan">
        <cfhttpparam type="formfield" name="lastname" value="Gates">
</cfhttp>
<cfdump var="#res#">

Problem: When defining returnType="struct" Error string can't cast String [{"COLUMNS":["COL1","COL2"],"DATA":[["0","7777777"],["0","888888"]]}] to a value of type [struct]

При определении returnType="string" ошибок не возникает "{\"COLUMNS\":[\"COL1\",\"COL2\"],\"DATA\":[[\"0\",\"7777777\"],[\"0\",\"888888\"]]}"

Попытка получить значения [DATA] в цикле

<cfloop from="1" to="#ArrayLen(d.DATA)#" index="i"> <cfloop from="1" to=#ArrayLen(d.DATA[i])# index="j"> <cfset resultSrt =d.COLUMNS[j]&" = " &d.DATA[i][j]> #resultSrt#<br> </cfloop> </cfloop>

Сообщение: No matching property [DATA] found in [string] Stacktrace:The Error Occurred in /opt/lucee/tomcat/webapps/ROOT/calling.cfm: line 52 50: 51: 52: <cfloop from="1" to="#ArrayLen(d.DATA)#" index="i"> 53: <cfloop from="1" to=#ArrayLen(d.DATA[i])# index="j"> 54: <cfset resultSrt =d.COLUMNS[j]&" = " &d.DATA[i][j]> Вывод


person IBM    schedule 30.11.2015    source источник
comment
Разве вы не сериализуете объект как строку JSON? Если да, то ReturnType должен быть строкой. Вы также можете установить для ReturnType значение JSON и не использовать функцию SerializeJSON. В зависимости от версии CF вы также можете рассмотреть возможность использования JSONUtil github.com/CFCommunity/jsonutil.   -  person James Moberg    schedule 01.12.2015
comment
я просто делаю serializeJSON(), возвращает ли он строку? никуда не кастую. я также пробовал время возврата JSON не работал   -  person IBM    schedule 01.12.2015


Ответы (1)


Прежде всего, поскольку вы возвращаете запрос, вы должны установить returnType в Query.

Если вы установили атрибут produces для cffunction на application/json, в этом случае вам не нужно выполнять явную сериализацию JSON при возврате данных. ColdFusion автоматически сделает это за вас. Вы можете просто написать:

<cfreturn Qry />

Чтобы прочитать результат, возвращаемый сервисом, вам необходимо десериализовать данные. Как это:

<cfdump var="#deserializeJson(res.filecontent)#"> 
person Pankaj    schedule 30.11.2015
comment
Спасибо за ответ, я сделал, как вы сказали, все еще выдавая мне строковый вывод. позвольте мне прояснить, что при запуске того же кода на сервере приложений CF10 он работает, и он дает мне возвращаемый массив - person IBM; 01.12.2015
comment
я сделал, как вы сказали, все еще выдавая мне строковый вывод Я изменил ваш код точно так, как описал Панкадж, и он отлично работал с Lucee. Я подозреваю, что вы забыли обновить или что-то в этом роде. - person Leigh; 01.12.2015
comment
@Leigh, я только что загрузил свой вывод, показывающий строку. я хочу ДАННЫЕ... как я могу сделать отдельные данные? Должен ли я использовать функцию find() для выбора требуемого значения? - person IBM; 01.12.2015
comment
мой вывод показывает строку Вывод по-прежнему неправильный. Когда вы видите, что кавычки экранированы символом \, например {\"COLUMNS\":..., это обычно означает, что вы ошибочно кодируете результат дважды. Чем-то отличается ваш код. Если вы примените шаги, предложенные Панкаджем - осторожно (по одному), это сработает. 1) установите для returnType значение Query. 2) Удалите serializeJSON и просто верните Qry. При необходимости обновите веб-службу 3) Десериализуйте строку ответа deserializeJson(res.filecontent) - person Leigh; 01.12.2015