Ответ JSON с использованием функции cfscript - PullRequest
8 голосов
/ 05 января 2012

У меня есть этот код как функция, которая отлично работает:

<cfcomponent extends="core.core">

<cffunction name="loadService" access="remote" returnformat="JSON">

    <cfscript>

        objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}';

    </cfscript>

<cfreturn objResponse>  

</cffunction>   

</cfcomponent>

Я пытаюсь преобразовать его в полную функцию cfscript следующим образом:

component extends="core.core"{

remote JSON function loadService(){

    objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}';

    SerializeJSON(objResponse);

    return objResponse; 
}

}

Первый способ возвращает JSON нормально, и я могу обработать его с помощью jQuery. Второй выдает ошибку «Значение, возвращаемое функцией loadService, не относится к типу JSON».

Я пробовал это с SerializeJSON и без него, и оба способа выдают эту ошибку. Я также попробовал это без указания JSON в синтаксисе функции. Это не выдает ошибку, но оборачивает вокруг нее информацию wddxpacket. Вот как это выглядит, когда я не указываю JSON:

<wddxPacket version='1.0'><header/><data><string>{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}</string></data></wddxPacket>

Я застрял на этом. Любая помощь будет отличной. Спасибо!

Ответы [ 3 ]

12 голосов
/ 05 января 2012

Правильный синтаксис CFScript в CF9:

remote any function loadService() returnformat="JSON" {

Технически, "JSON" не является допустимым типом возврата из функции ( см. Здесь для всех типов возврата ), но когда вынапишите:

remote JSON function

... вы в основном так говорите.

Обратите внимание, что в вызове функции на основе тегов вы не указываете returnType ... так что угадайте, что это по умолчанию?(подсказка: любая).

Легко смешать returnType и returnFormat up.Простая настройка выше, и вы должны быть готовы пойти.

Полный код

component extends="core.core" {

remote any function loadService() returnFormat="JSON" {

    objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}';

    SerializeJSON(objResponse);

    return objResponse; 
}

}
2 голосов
/ 05 января 2012

Также я заметил, что у вас есть

SerializeJSON(objResponse);

в вашей функции. Эта строка не влияет на возврат вашей функции. Таким образом, его можно легко опустить, поскольку ваше значение objResponse уже находится в строке JSON. Но если значение objResponse было что-то вроде

objResponse = {
    "CONFIG" = [["internal"], ["success"]],
    "DATA" = [["Message1"]]
};

тогда вы могли бы сделать что-то вроде

return serializeJSON(objResponse);

, который превратит сложные данные, которые у вас были, в строку JSON.

Вот полная функция

remote any function loadService()
    returnFormat="JSON"
{
    objResponse = {
        "CONFIG" = [["internal"], ["success"]],
        "DATA" = [["Message1"]]
    };

    return serializeJSON(objResponse);
}
1 голос
/ 27 марта 2015

Другой способ указать returnFormat - использовать аннотации:

component extends="core.core" {
/**
 * @hint         loads properties of an object and returns them in as JSON
 * @output       false
 * @returnFormat JSON
 */
remote struct function loadService() {
  objResponse = {
    CONFIG = [["internal"],[ "success"]],
    DATA = [["Message1"]]
  };
  return objResponse; 
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...