2012-05-04 30 views
18

मैं एक AJAX WCF विधि को कॉल करने के लिए jquery का उपयोग कर रहा हूं जो JSON स्ट्रिंग के रूप में ऑब्जेक्ट्स की एक सूची देता है। जब यह Fiddler2 में निरीक्षण (TextView में) JSON स्ट्रिंग इस तरह दिखता है:jquery AJAX कॉल रिटर्न JSON पार्सिंग त्रुटि

{"d":"[{\"ID\":\"6b2b8c62-31ce-4df2-982b-054ff5f6be72\",\"Name\":\"Carol\",\"Surname\":\"IrishWife\"},{\"ID\":\"d254740a-0a0f-4a1e-9e4f-0812227dd5af\",\"Name\":\"Willie\",\"Surname\":\"Le Roux\"},{\"ID\":\"660bf0dd-436a-4588-a9c0-19fd6fdcee23\",\"Name\":\"Emmas\",\"Surname\":\"Mum\"},{\"ID\":\"6b9403c5-b728-4e96-bcb1-203e7472eec3\",\"Name\":\"Owen\",\"Surname\":\"Lima\"},{\"ID\":\"d52c08fb-4418-4600-960f-243ff4443ee6\",\"Name\":\"Tim\",\"Surname\":\"Lee\"},{\"ID\":\"e2aacf5b-8855-44ce-9338-3d39f8ab3349\",\"Name\":\"Marcello\",\"Surname\":\"MT\"},{\"ID\":\"578be087-8385-46d6-89de-3db31d352cbc\",\"Name\":\"Carlyn\",\"Surname\":\"Homegroup\"},{\"ID\":\"4c805825-2bee-447a-8b75-41ead17db33e\",\"Name\":\"George\",\"Surname\":\"Homegroup\"},{\"ID\":\"ae48804f-5e78-42c8-9ba0-4214c98a5a89\",\"Name\":\"Isla\",\"Surname\":\"Le Roux\"},{\"ID\":\"f8be2f4f-fedb-4863-8a84-44fddea84ea9\",\"Name\":\"Peter\",\"Surname\":\"Anderson\"},{\"ID\":\"15e7644d-ec43-44ff-a959-47e00112da6b\",\"Name\":\"Kitty\",\"Surname\":\"Corbett\"},{\"ID\":\"8fd7fccc-335c-4d5c-93b5-4b00f96a9950\",\"Name\":\"Natalie\",\"Surname\":\"Archibald\"},{\"ID\":\"09b5aad2-2cf1-488a-962b-4d692b05ddea\",\"Name\":\"Miku\",\"Surname\":\"Heally\"},{\"ID\":\"affa369e-5af3-4537-a0f4-71422956da41\",\"Name\":\"Steven\",\"Surname\":\"Corbett\"},{\"ID\":\"65f57da3-4f88-4798-9590-83b4ccecfc44\",\"Name\":\"Tim\",\"Surname\":\"Archibald\"},{\"ID\":\"53bfb451-f66f-4b6e-b430-8d13c95b30d8\",\"Name\":\"Philip\",\"Surname\":\"MT\"},{\"ID\":\"c7f22b9b-4030-4f82-9f75-bbb726cabb73\",\"Name\":\"Vincent\",\"Surname\":\"Van Der Walt\"},{\"ID\":\"232577be-3165-4316-a20d-c2f2a09c5382\",\"Name\":\"Scott\",\"Surname\":\"Lynn\"},{\"ID\":\"913508a1-5dca-4504-8caf-c8e3dc386fc0\",\"Name\":\"Dan\",\"Surname\":\"MT\"},{\"ID\":\"36054a07-b14d-4c1c-b35f-e00875dde7e5\",\"Name\":\"Sarah\",\"Surname\":\"MT\"},{\"ID\":\"f14e7d98-e040-4ba9-928f-f2ff48116b0b\",\"Name\":\"Josh\",\"Surname\":\"IrishDude\"}]"} 

जब मैं Fiddler के JSON दृश्य में परिणाम का निरीक्षण किया, तो निम्न बातें JSON पता चलता है:

d=[{"ID":"6b2b8c62-31ce-4df2-982b-054ff5f6be72","Name":"Carol","Surname":"IrishWife"},{"ID":"d254740a-0a0f-4a1e-9e4f-0812227dd5af","Name":"Willie","Surname":"Le Roux"},{"ID":"660bf0dd-436a-4588-a9c0-19fd6fdcee23","Name":"Emmas","Surname":"Mum"},{"ID":"6b9403c5-b728-4e96-bcb1-203e7472eec3","Name":"Owen","Surname":"Lima"},{"ID":"d52c08fb-4418-4600-960f-243ff4443ee6","Name":"Tim","Surname":"Lee"},{"ID":"e2aacf5b-8855-44ce-9338-3d39f8ab3349","Name":"Marcello","Surname":"MT"},{"ID":"578be087-8385-46d6-89de-3db31d352cbc","Name":"Carlyn","Surname":"Homegroup"},{"ID":"4c805825-2bee-447a-8b75-41ead17db33e","Name":"George","Surname":"Homegroup"},{"ID":"ae48804f-5e78-42c8-9ba0-4214c98a5a89","Name":"Isla","Surname":"Le Roux"},{"ID":"f8be2f4f-fedb-4863-8a84-44fddea84ea9","Name":"Peter","Surname":"Anderson"},{"ID":"15e7644d-ec43-44ff-a959-47e00112da6b","Name":"Kitty","Surname":"Corbett"},{"ID":"8fd7fccc-335c-4d5c-93b5-4b00f96a9950","Name":"Natalie","Surname":"Archibald"},{"ID":"09b5aad2-2cf1-488a-962b-4d692b05ddea","Name":"Miku","Surname":"Heally"},{"ID":"affa369e-5af3-4537-a0f4-71422956da41","Name":"Steven","Surname":"Corbett"},{"ID":"65f57da3-4f88-4798-9590-83b4ccecfc44","Name":"Tim","Surname":"Archibald"},{"ID":"53bfb451-f66f-4b6e-b430-8d13c95b30d8","Name":"Philip","Surname":"MT"},{"ID":"c7f22b9b-4030-4f82-9f75-bbb726cabb73","Name":"Vincent","Surname":"Van Der Walt"},{"ID":"232577be-3165-4316-a20d-c2f2a09c5382","Name":"Scott","Surname":"Lynn"},{"ID":"913508a1-5dca-4504-8caf-c8e3dc386fc0","Name":"Dan","Surname":"MT"},{"ID":"36054a07-b14d-4c1c-b35f-e00875dde7e5","Name":"Sarah","Surname":"MT"},{"ID":"f14e7d98-e040-4ba9-928f-f2ff48116b0b","Name":"Josh","Surname":"IrishDude"}] 

तो Fiddler पार्स कर सकते हैं इसे सफलतापूर्वक, लेकिन ग्राहक पर, jQuery ajax त्रुटि कॉलबैक फ़ंक्शन निम्न त्रुटि प्रदर्शित करता है:

Error: No conversion from text to application/json 

WCF विधि के रूप में परिभाषित किया गया है इस प्रकार है:

[OperationContract] 
    [WebGet(ResponseFormat=WebMessageFormat.Json)] 
    public string GetPeople(Guid groupId) 
    { 
     using (SchedulerContext context = new SchedulerContext()) 
     { 
      JavaScriptSerializer ser = new JavaScriptSerializer(); 

      var query = from p in context.People 
         where p.Group_ID == groupId 
         select new 
         { 
          p.ID, 
          p.Name, 
          p.Surname 
         }; 

      return ser.Serialize(query.ToArray()); 
     } 
    } 

और अंत में, बुला jQuery है:

$.ajax(
     { 
      type: "GET", 
      dataType: "application/json", 
      contentType: "json", 
      data: { groupId: 'ae09a080-5d7c-4e92-9a87-591574b7c4b8' }, 
      url: "WebAPI.svc/GetPeople", 
      error: function (jqXHR, textStatus, errorThrown) { 
       alert("error"); 
      }, 
      success: function (msg) { 
       alert(msg.d[0].Name); 
      } 
     } 
); 

अग्रिम धन्यवाद!

अद्यतन: @ user1370958 के लिए धन्यवाद, समाधान के करीब एक कदम।

जब इसे सफलतापूर्वक निम्नलिखित परिणाम देता है के लिए त्रुटि कॉलबैक फ़ंक्शन बदल रहा है ...

error: function (jqXHR, textStatus, errorThrown) { 
    var test = $.parseJSON(jqXHR.responseText); 
    var test2 = $.parseJSON(test.d); 
    alert(test2[0].Name); 
}, 

सुनिश्चित नहीं हैं कि क्यों, लेकिन मैं परिणाम को पार्स और फिर उस के अंदर नेस्टेड वस्तुओं पार्स करने के लिए की है। मैं अगर मेरे लौटे प्रकारों में से किसी भी एक और पार्स आवश्यकता होती निहित जटिल वस्तुओं संभालने हूँ ...

उत्तर

48

यहाँ, "application/json" नहीं डेटाप्रकार संपत्ति के लिए मान्य मान है। मैंने इसे अपनी परियोजना में "जेसन" में बदल दिया और एक ही समस्या हल हो गई।

यहाँ विवरण की जांच करें (टिप्पणी 7 #): http://bugs.jquery.com/ticket/8216

+0

एप्लिकेशन/जेसन का उपयोग http हेडर में jquery AJAX में नहीं किया जाता है। बस पुष्टि की। –

3

कोशिश अपने सर्वर-साइड कोड में MIME प्रकार जोड़ने:

Response.ContentType = "application/json"; 
+0

हाँ मुझे कोई सफलता के साथ है, धन्यवाद हालांकि – hofnarwillie

0

मुझे लगता है आप चाहते हैं क्लाइंट (एरे) में ser.Serialize(query.ToArray()) के मान को वापस करने के लिए। लेकिन आप इसे एक स्ट्रिंग के रूप में वापस कर रहे हैं, इसलिए डब्ल्यूसीएफ उस JSON को एक स्ट्रिंग में से बच जाएगा, और आप जो खत्म करेंगे, वह सरणी नहीं है, बल्कि एक स्ट्रिंग है।

चूंकि आप अज्ञात प्रकारों का उपयोग कर रहे हैं, जिन्हें डब्ल्यूसीएफ द्वारा समर्थित रूप से समर्थित नहीं है, आपको JavaScriptSerializer का उपयोग करने की आवश्यकता है। तो JSON (स्ट्रिंग में) के डबल-एन्कोडिंग को रोकने के लिए आपको डेटा को Stream के रूप में वापस करना चाहिए, ताकि डब्लूसीएफ आपके डेटा को स्पर्श न करे (नीचे नमूना कोड देखें)।

एक और बात: मैं देख रहा हूँ आपकी प्रतिक्रिया एक {"d":...} आवरण है, जो पता चलता है कि आप <enableWebScript/>/WebScriptEnablingBehavior/WebScriptServiceHostFactory उपयोग कर रहे हैं जब आपके सेवा/अंतबिंदु को परिभाषित करता हुआ। चूंकि आप एएसपी.NET AJAX लाइब्रेरी का उपयोग नहीं कर रहे हैं, इसलिए आपको उस रैपिंग की आवश्यकता नहीं है, इसलिए आप इसके बजाय "सरल" <webHttp/>/WebHttpBehavior/WebServiceHostFactory का उपयोग कर सकते हैं, और आपकी प्रतिक्रिया उस "डी" ऑब्जेक्ट में लिपटे नहीं जाएगी ।

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json)] 
public System.IO.Stream GetPeople(Guid groupId) 
{ 
    using (SchedulerContext context = new SchedulerContext()) 
    { 
     JavaScriptSerializer ser = new JavaScriptSerializer(); 

     var query = from p in context.People 
        where p.Group_ID == groupId 
        select new 
        { 
         p.ID, 
         p.Name, 
         p.Surname 
        }; 

     string json = ser.Serialize(query.ToArray()); 
     using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
     { 
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; 
      return ms; 
     } 

} 
+0

धन्यवाद, लेकिन कोई किस्मत। मैंने आपका कोड कॉपी किया है, लेकिन अब जावास्क्रिप्ट त्रुटि कॉलबैक में कोई त्रुटि जानकारी नहीं है, बस खाली स्ट्रिंग्स और कहती है कि त्रुटि "त्रुटि" है। इसके अलावा, कोई और परिणाम नहीं लौटा। – hofnarwillie

+0

यह देखने के लिए सर्वर पर ट्रेसिंग सक्षम करने का प्रयास करें कि क्या कुछ अजीब चल रहा है या नहीं। या यह देखने के लिए कि कोई अतिरिक्त जानकारी है या नहीं, वास्तविक नेटवर्क प्रतिक्रिया (फिडलर या ब्राउज़र डेवलपर टूल का उपयोग करके) देखें। – carlosfigueira

+0

"[फिडलर] ReadResponse() विफल: सर्वर ने इस अनुरोध के लिए प्रतिक्रिया नहीं दी।" – hofnarwillie

1

WCF 4.0 के साथ, आप एक विशेषता है जो सेवा HTTP अनुरोध में Accept हैडर को देखने के लिए निर्धारित करने के लिए क्या प्रारूप पर वापस लौट सकते automaticFormatSelectionEnabled कहा जाता है जोड़ सकते हैं। जब तक आप वापस लौट रहे हैं, धारावाहिक है, डब्ल्यूसीएफ आपके लिए सही क्रमबद्धता को संभालेगा। आपके jQuery AJAX कॉल में, स्वीकृति हेडर accepts: {json: "application/json"} सहित जोड़ा जाता है।

+0

मैं इसे आज़माउंगा, मैं स्वचालित फ़ॉर्मैट चयन चयन सक्षम कहां करूं? – hofnarwillie

+0

उत्तर में लिंक दिखाता है कि इसे कॉन्फ़िगरेशन या प्रोग्रामेटिक रूप से कैसे जोड़ना है। –

+0

मैंने आपके द्वारा बताई गई सामग्री को जोड़ने का प्रयास किया। यह सर्वर को सफलतापूर्वक कॉल करता है और मैं वेबजीईटी के माध्यम से कदम उठा सकता हूं। फिर यह वापस आता है, लेकिन फिडलर रिपोर्ट करता है: [फिडलर] ReadResponse() विफल: सर्वर ने इस अनुरोध के लिए प्रतिक्रिया नहीं दी। और त्रुटि कॉलबैक बिना किसी लौटे डेटा के फिर से चलाता है। – hofnarwillie

0

मैं एक वैकल्पिक हल मिल गया है:

पहली समस्या इकाई मॉडल पर वृत्तीय संदर्भ अपवाद था। इस पर काबू पाने के लिए मैं संदर्भ से अपनी इकाइयों को अलग करने के लिए निम्न कोड का उपयोग करता हूं और फिर उन्हें स्ट्रिंग में क्रमबद्ध करता हूं। मैं उसके बाद नीचे दिए गए कोड का उपयोग कर क्लाइंट पर उन्हें क्रमबद्ध करता हूं।

सेवा

[WebGet(ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    public string[] GetPeople(Guid groupId) 
    { 
     using (SchedulerContext context = new SchedulerContext()) 
     { 

      var people = (from p in context.People 
          where p.Group_ID == groupId 
          select p).ToList(); 

      JavaScriptSerializer ser = new JavaScriptSerializer(); 
      string[] result = new string[people.Count]; 
      for (int i = 0; i<people.Count; i++) 
      { 
       context.Detach(people[i]); 
       string json = ser.Serialize(people[i]); 
       result[i] = json; 
      } 
      return result; 
     } 
    } 

ग्राहक

 $.ajax(
       { 
        type: "GET", 
        //dataType: "application/json", 
        //dataType: "text/plain", 
        contentType: "json", 
        data: { groupId: 'ae09a080-5d7c-4e92-9a87-591574b7c4b8' }, 
        //data: { groupId: 'test' }, 
        //data: { groupId: '739526F1-7C58-4E3B-97D8-4870948BFE32' }, 
        url: "WebAPI.svc/GetPeople", 
        error: function (jqXHR, textStatus, errorThrown) { 
         alert(jqXHR.resultText); 
        }, 
        success: function (people) { 
         //the returned param "people" is of type string[], so each string needs parsed 
         $(people).each(function (index, value) { 
          var person = $.parseJSON(value); 
          //now I can use the Person object 
         }); 

        } 
       } 

     ); 
संबंधित मुद्दे