2010-06-08 12 views
7

में जेएसओएन लपेटता है मेरे पास JSON को वापस मेरे जावास्क्रिप्ट पर पास करने के लिए एक वेबमाइंड वाला एएसपीनेट पृष्ठ है।एएसपी.नेट वेबमाउड उद्धरण

[WebMethod] 
public static string getData(Dictionary<string, string> d) { 

    string response = "{ \"firstname\": \"John\", \"lastname\": \"Smith\" }"; 

    return response; 

} 

जब यह ग्राहक इस प्रकार के रूप में यह स्वरूपित है के लिए वापस आ गया है::

{ \"d\": \"{ \"firstname\": \"John\", \"lastname\": \"Smith\" }\" } 

समस्या के तहत 'प' सब कुछ लपेटकर दोहरे उद्धरण चिह्नों है

Bellow वेब विधि है। क्या कुछ ऐसी चीज है जो मैंने वेब विधि में छोड़ी है या उद्धरण के बिना डेटा लौटने के कुछ अन्य साधन हैं? मैं वास्तव में हर बार ग्राहक पर इसे अलग करना नहीं चाहता हूं। इसके अलावा मैंने अन्य लेख भी देखे हैं जहां ऐसा नहीं होता है।

किसी भी मदद की सराहना की जाएगी धन्यवाद।

उत्तर

8

मुझे लगता है कि आप वस्तु

{ 
    firstname:"John", 
    lastname:"Smith" 
} 

लेकिन अपने विधि हस्ताक्षर एक स्ट्रिंग लौटने की JSON प्रतिनिधित्व लौटना चाहते। एएसपी.Net ढांचे क्रमबद्धता सही स्ट्रिंग response क्रमबद्ध है। , दूसरे शब्दों में यदि आपके समारोह

string response = "foo"; 
return response; 

था आपको आश्चर्य अगर उत्पादन

{"d":{"foo"}} 

यह सिर्फ होता है कि response दोहरे उद्धरण चिह्नों भाग निकले जाने की जरूरत है कि है था नहीं होगा।

आप स्पष्ट रूप से केवल वस्तु पर जाना चाहते हैं। आपके पास 2 विकल्प हैं: -

1) स्ट्रिंग को किसी ऑब्जेक्ट में बदलने के लिए अपने जावास्क्रिप्ट में eval का उपयोग करें।

function onSuccessCallback(retval) { 
    var obj = eval(retval.d); 
}` 

2) या (और यह मेरा पसंदीदा समाधान है) अपने विधि एक वास्तविक वस्तु लौटने और JSON जाने serialisationof ढांचे बड़े कार्य करने कर आप

[WebMethod] 
public static object getData(Dictionary<string, string> d) { 
    var response = new { firstname = "John", lastname="Smith" }; 
    return response; 
} 

आपको लगता है कि यह देखेंगे के लिए है प्रतिक्रिया है कि आप शायद मूल रूप से उम्मीद उत्पन्न करता है (उदाहरण के लिए {"d":{"firstname":"John", "lastname":"Smith"}}

+1

पी एस। यदि आप अपने फ़ंक्शन को JSON युक्त स्ट्रिंग को वापस रखना चाहते हैं, तो मैं जोखिम स्ट्रैल के ToJson एक्सटेंशन फ़ंक्शन [http://www.west-wind.com/weblog/posts/442969.aspx] जैसे कुछ का उपयोग करने का सुझाव देता हूं। आपका विधि निकाय तब नया हो सकता है {firstname = "John"}। ToJson()। –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, यह बहुत दिलचस्प है। मुझे एहसास नहीं हुआ कि आप सी # में वस्तुओं को बना सकते हैं। हालांकि मैंने ऑब्जेक्ट्स से जेसन स्ट्रिंग बनाने के लिए पहले से ही एक फ्रेमवर्क बनाया है, इसलिए क्लाइंट-साइड विकल्प का उपयोग करना होगा। मैं भविष्य की परियोजनाओं में सर्वर-साइड विकल्प में देखूंगा। धन्यवाद। – markvpc

3

वास्तव में इस पूरे मुद्दे मौजूद है क्योंकि आप बाहर सोचने के लिए ASP.Net वेब सेवाओं कोशिश कर रहे हैं। आप अपने डेटा आर होने के लिए एक वर्ग सेटअप करने की जरूरत है परिणामों को कतारबद्ध करने और उन्हें वापस करने के लिए उस वर्ग (या सूची (YourClass का)) का उपयोग करें और उपयोग करें।

एक महान लेख सभी इस (एक बहुत आम ख़तरा) समझा है: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

-1

मैं अपने कोड के साथ एक समान मुद्दा था। मैं एक एक्सएमएल डॉक्यूमेंट को जेएसओएन के रूप में कॉलिंग स्क्रिप्ट पर वापस करने की कोशिश कर रहा था लेकिन वेब सेवा से XmlDocument लौटने से सरणी का एक खाली सेट लौटाया गया (जैसा कि एक्सएमएल डॉक्यूमेंट्री धारावाहिक नहीं है!)।

यदि मैं स्क्रिप्ट सेवा को विशेषता ResponseFormat.JSON के साथ सेट करता हूं तो मेरा JSON डबल-एस्केप था।

आउट-फॉक्स एएसपी.नेट का तरीका एएसपी को बताना है।कि आप XML लौट रहे हैं और फिर इसे नहीं आपके JSON ;-)

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)] 
    public String MyJSONWebService(String sParam1, String sParam2, String sParam3) 
    { 
     ... do stuff..... 
     XmlDocument oXMLDocument = new XmlDocument(); 
     oXMLDocument.LoadXml(sXML); 
     sJSON = JsonConvert.SerializeXmlNode(oXMLDocument.SelectSingleNode("autnresponse")); 
     return sJSON; 
    } 

डबल बच जाएंगे मैं जानता हूँ कि यह एक हैक है, लेकिन नेट .....