json
  • coldfusion
  • 2012-01-05 25 views 8 likes 
    8

    tengo este código como un cffunction que funciona bien:respuesta JSON usando cfscript función

    <cfcomponent extends="core.core"> 
    
    <cffunction name="loadService" access="remote" returnformat="JSON"> 
    
        <cfscript> 
    
         objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}'; 
    
        </cfscript> 
    
    <cfreturn objResponse> 
    
    </cffunction> 
    
    </cfcomponent> 
    

    Estoy tratando de convertirlo en una función cfscript completa así:

    component extends="core.core"{ 
    
    remote JSON function loadService(){ 
    
        objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}'; 
    
        SerializeJSON(objResponse); 
    
        return objResponse; 
    } 
    
    } 
    

    La primera forma devuelve JSON bien y puedo procesarlo con jQuery. El segundo lanza y el error "El valor devuelto por la función loadService no es del tipo JSON".

    Lo he intentado con y sin SerializeJSON y ambas formas arrojan ese error. También lo intenté sin especificar JSON en la sintaxis de la función. Eso no arroja un error, pero sí envuelve la información de wddxpacket. Esto es lo que parece cuando no especifico JSON:

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

    Estoy atascado en esto. Cualquier ayuda sería genial. ¡Gracias!

    Respuesta

    10

    La sintaxis correcta en CFScript CF9 es:

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

    Técnicamente, "JSON" no es un tipo de retorno válida de una función (see here for all returntypes), pero cuando se escribe:

    remote JSON function 
    

    .. .usted básicamente está diciendo eso.

    Aviso en su llamada de función basada en etiquetas, no especifica un tipo de retorno ... así que adivine qué es de forma predeterminada? (sugerencia: cualquiera).

    Es fácil mezclar returnType y returnFormat up. Un simple ajuste anterior y debería estar listo para empezar.

    código completo

    component extends="core.core" { 
    
    remote any function loadService() returnFormat="JSON" { 
    
        objResponse = '{"CONFIG":[["internal"],[ "success"]],"DATA":[["Message1"]]}'; 
    
        SerializeJSON(objResponse); 
    
        return objResponse; 
    } 
    
    } 
    
    +0

    Vaya, veo ahora. Estaba mezclando el tipo de devolución y el formato de devolución. Eso fue estupido. Agregué el returnformat = "JSON" y funcionó muy bien. Gracias por la ayuda. Realmente lo aprecio. – Sequenzia

    +0

    Definitivamente tome nota del comentario de Peruz sobre SerializeJSON(). –

    +0

    Usted dijo "La sintaxis CFScript correcta en CF9 es:", ¿hay algún tipo de documentación para CFScript ... cómo lo supo? – John

    2

    Además, he notado que usted tiene

    SerializeJSON(objResponse); 
    

    en su función. Esta línea no tiene efecto en el retorno de tu función. Por lo tanto, se puede omitir fácilmente ya que su valor objResponse ya está en una cadena JSON. Sin embargo, si el valor de objResponse era algo así como

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

    entonces usted podría haber hecho algo así como

    return serializeJSON(objResponse); 
    

    que tendría a su vez el complejo de datos que tenía en una cadena JSON.

    Aquí es la función completa

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

    Gracias por los comentarios. Estaba jugando con la ubicación de serializeJSON. Esto ayuda a – Sequenzia

    +0

    +1, buena captura en este caso. –

    1

    Otra forma de especificar el 'returnFormat' sería el uso de anotaciones:

    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; 
    } 
    } 
    
    Cuestiones relacionadas