使用cfscript函数的JSON响应

9

我有这个cffunction的代码,它工作得很好:

<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和不使用SerializeJSON两种方式,但都会出现这个错误。我也尝试过在函数语法中不指定JSON,这样不会抛出错误,但它会在数据周围包装wddxpacket信息。当我不指定JSON时,它看起来像这样:
<wddxPacket version='1.0'><header/><data><string>{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}</string></data></wddxPacket>

我卡在这里了,需要帮助。谢谢!
3个回答

15

CF9中正确的CFScript语法是:

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

从技术上讲,"JSON" 不是函数的有效返回类型(在这里可以查看所有的返回类型),但当你编写如下代码时:

remote JSON function

你基本上是在说。

注意,在基于标签的cffunction调用中,您没有指定returnType...所以默认值是什么?(提示:任何)。

混淆returnType和returnFormat很容易。稍作修改即可轻松解决。

完整代码

component extends="core.core" {

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

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

    SerializeJSON(objResponse);

    return objResponse; 
}

}

哇,现在我明白了。我混淆了返回类型和返回格式。那太愚蠢了。我添加了returnformat="JSON",它运行得很好。感谢你的帮助。我非常感激。 - Sequenzia
一定要注意Peruz的关于SerializeJSON()的评论。 - Shawn Holmes
你说:“CF9中正确的CFScript语法是:”,是否有关于CFScript的文档...你是怎么知道的? - John
如果你能相信的话,我从Adobe.com的CF9错误数据库中找到了正确的语法:http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=71676 - Shawn Holmes
@ShawnHolmes,在开发Adobe ColdFusion 10应用程序中简要提到了这种语法,但当然没有详细信息。 - Jared Beck

3
此外,我注意到你有

标签。
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);
}

谢谢您的反馈。我实际上正在调整serializeJSON的位置。这很有帮助。 - Sequenzia

1

指定'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; 
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接