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

    tôi có mã này như một cffunction rằng hoạt động tốt:JSON phản ứng sử dụng cfscript chức năng

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

    Tôi cố gắng để chuyển nó sang một hàm cfscript đầy đủ như thế này:

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

    Cách thứ nhất trả về JSON tốt và tôi có thể xử lý nó với jQuery. Câu lệnh thứ hai ném và lỗi "Giá trị được trả về từ hàm loadService không phải là kiểu JSON."

    Tôi đã thử nó có và không có SerializeJSON và cả hai cách đều ném lỗi đó. Tôi cũng đã thử nó mà không cần chỉ định JSON trong cú pháp hàm. Điều đó không ném một lỗi nhưng nó quấn thông tin wddxpacket xung quanh nó. Đây là hình thức của nó khi tôi không chỉ định JSON:

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

    Tôi bị kẹt trong này. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời. Cảm ơn!

    Trả lời

    10

    Cú pháp CFScript đúng trong CF9 là:

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

    Về mặt kỹ thuật, "JSON" không phải là một returntype hợp lệ từ một hàm (see here for all returntypes), nhưng khi bạn viết:

    remote JSON function 
    

    .. .you're về cơ bản nói điều đó.

    Lưu ý trong cuộc gọi cffunction dựa trên thẻ của bạn, bạn không chỉ định returnType ... vì vậy hãy đoán nó là gì theo mặc định? (gợi ý: bất kỳ).

    Thật dễ dàng để kết hợp returnType và returnFormat lên. Một điều chỉnh đơn giản ở trên và bạn nên tốt để đi.

    Hoàn Mã

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

    Wow, tôi thấy bây giờ. Tôi đã trộn lên các returntype và trở lại định dạng. Điều đó thật ngu ngốc. Tôi đã thêm returnformat = "JSON" và nó hoạt động rất tốt. Cảm ơn đã giúp đỡ. Tôi rất trân trọng điều này. – Sequenzia

    +0

    Chắc chắn lưu ý nhận xét của Peruz về SerializeJSON(). –

    +0

    Bạn nói "Cú pháp CFScript chính xác trong CF9 là:", có một số loại tài liệu cho CFScript ... làm sao bạn biết điều này? – John

    2

    Ngoài ra, tôi nhận thấy rằng bạn có

    SerializeJSON(objResponse); 
    

    trong chức năng của bạn. Dòng này không ảnh hưởng đến chức năng trả về của bạn. Vì vậy, nó có thể dễ dàng được coi là giá trị objResponse của bạn đã có trong một chuỗi JSON. Nhưng, nếu giá trị của objResponse là một cái gì đó giống như

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

    sau đó bạn có thể làm một cái gì đó giống như

    return serializeJSON(objResponse); 
    

    mà sẽ phải lần lượt các dữ liệu phức tạp bạn có vào một chuỗi JSON.

    Dưới đây là hoàn chỉnh các chức năng

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

    Cảm ơn phản hồi. Tôi đã thực sự chơi với vị trí của serializeJSON. Điều này giúp – Sequenzia

    +0

    +1, bắt tốt trên trang này. –

    1

    Một cách khác để xác định 'returnFormat' sẽ được sử dụng chú thích:

    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; 
    } 
    } 
    
    Các vấn đề liên quan