2012-05-10 17 views
5

का उपयोग करके सरल JSON ऑब्जेक्ट कैसे बनाएं I JSON के लिए नया हूं, और स्ट्रिंगबिल्डर का उपयोग करके सरल JSON ऑब्जेक्ट बनाना चाहता हूं जिसे एक jQuery अजाक्स कॉल द्वारा पूछताछ की जाएगी।सी # स्ट्रिंग बिल्डर

[WebMethod] 
public static string GetmyJSON() 
{ 
    StringBuilder sb = new StringBuilder();  
    sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}"); 
    return sb.ToString();  

} 

मेरे क्लाइंट-साइड कोड में मेरे पास है:

.ajax({ 

     type: "POST", 
     url: "simplePage.aspx/GetmyJSON",   
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 

     success: function (data) { 

      alert(data.d.firstname);    


     } // end of sucess 

    }); // End of ajax 

लेकिन मेरी चेतावनी संदेश से पता चलता बजाय 'मानस' की 'अनिर्धारित'। क्या स्ट्रिंगबिल्डर का उपयोग कर JSON ऑब्जेक्ट को वापस करना संभव है?

+0

आप उचित .NET ऑब्जेक्ट बना सकते हैं जो उस डेटा को समाहित करता है जिसे आप वापस भेजना चाहते हैं और JSON.Net जैसी कुछ लाइब्रेरी के माध्यम से उन्हें JSON में serailze करें।यदि आप कुछ अंतर्निर्मित तकनीक चाहते हैं तो डेटाकंट्रैक्टसेरियलाइज़र – deostroll

+0

के साथ कुछ शोध करें यदि आप इसे इस तरह से बनाने का आग्रह करते हैं, तो ईथर ने '\" '' '' '' को बदल दिया है, ईथर इसे '\\\ "' – Aristos

+1

JSON संपत्ति नामों में बदल दें उद्धृत किया जाना चाहिए, यानी: '{" आईडी ": 10}' – canon

उत्तर

3
var lstMes = new List<Person>(); 

      System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
      new System.Web.Script.Serialization.JavaScriptSerializer(); 
       string sJSON = oSerializer.Serialize(lstMes); 
       return sJSON; 

न करने के लिए संदर्भ जोड़ने के लिए भूल जाते हैं:

System.Web.Extensions.dll !! 
10

कभी ऐसा। कभी भी मैन्युअल रूप से JSON का निर्माण करें। हमेशा JSON serializers का उपयोग करें। या आपके मामले में आपको ऐसा करने की भी आवश्यकता नहीं है क्योंकि एएसपी.नेट वेबमाइड रनटाइम ख्याल रखेगा। आपको बस इतना करना है कि आप अपनी व्यावसायिक आवश्यकताओं पर ध्यान केंद्रित करें और नलसाजी के बारे में चिंता न करें।

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

और उसके बाद अपने वेब विधि है इस मॉडल ढांचे के लिए सभी क्रमबद्धता चिंताओं छोड़ने वापसी:

इसलिए उदाहरण के लिए एक मॉडल है कि आपके डेटा का प्रतिनिधित्व करेंगी को परिभाषित करते हुए शुरू

[WebMethod] 
public static Person GetPerson() 
{ 
    Person p = new Person(); 
    p.FirstName = "Manas"; 
    p.LastName = "Tunga"; 
    return p; 
} 

और अब क्लाइंट से इस विधि का उपभोग करें:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: '{ }', 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

कोई नी घ JSON, स्ट्रिंग बिल्डरों, के बारे में चिंता करने के लिए ...

और तुम भी अपने वेब विधि करने के लिए जटिल तर्क दे सकते हैं अगर आप की जरूरत:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

और उसके बाद:

[WebMethod] 
public static Person GetPerson(Foo foo) 
{ 
    ... 
} 

और अंत में:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: JSON.stringify({ foo: { bar: 'baz' } }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

JSON.stringify विधि यहाँ दिखाया गया है मूल रूप से आधुनिक ब्राउज़र में बनाया गया है रों। यदि आपको विरासत ब्राउज़र का समर्थन करने की आवश्यकता है तो आप अपने पृष्ठ पर json2.js स्क्रिप्ट शामिल कर सकते हैं।

+0

यदि मैं आपको JSON मैन्युअल रूप से बनाने के लिए स्ट्रिंग बिल्डर का उपयोग करने का आग्रह करता हूं तो आप इसे कैसे करेंगे। मुझे पता है कि मेरी गलती कहां थी – manas

+0

आप तारों का उपयोग कर JSON मैन्युअल रूप से निर्माण के रूप में गलत कुछ पर जोर नहीं दे सकते। आपके द्वारा उठाए गए दृष्टिकोण में क्या गलत है। बात यह है कि आप अपनी वेब विधि से एक स्ट्रिंग लौट रहे हैं। तो आपकी सफलता हैंडलर के अंदर आपको इस स्ट्रिंग को किसी ऑब्जेक्ट पर वापस पार्स करना होगा यदि आप इसे एक्सेस करना चाहते हैं, जैसे कि 'चेतावनी ($। ParseJSON (data.d)। पहला नाम); '। लेकिन कृपया, ओह कृपया मुझे वादा करो कि आप ऐसा कुछ भी नहीं करेंगे। –

+0

@DarinDimitrov, आप केवल विश्वास करने के लिए आधिकारिक हैं और मेरी प्रदर्शन चिंताओं को खारिज करते हैं, लेकिन मैं अभी भी उत्सुक हूं कि यह क्यों बुरा है और क्यों बीसीएल में स्ट्रिंगबिल्डर, एक्सएमएलवाइटर, एचटीएमएलटीक्स्टवाइटर के समानता में कोई मूल जेसनबिल्डर वर्ग नहीं है। वे सब ठीक क्यों हैं, लेकिन जेसनबिल्डर बुराई है? मान लें कि मुझे 5 गुणों की साधारण वस्तुएं बनाने की आवश्यकता है, लेकिन कुछ गुणों को केवल तभी परिभाषित किया जाना चाहिए जब कुछ शर्तों को पूरा किया जाए। ऐसे मामले के लिए मॉडल पदानुक्रम को परिभाषित करना बहुत जटिल है - मैं तब गतिशील या शब्दकोश का उपयोग करूंगा। यह प्रदर्शन को थोड़ा सा नुकसान पहुंचाएगा ... –

0

कड़ाई से सवाल का जवाब - हाँ आप जो भी चाहते हैं उसे .NET विधि से वापस कर सकते हैं। आपकी समस्या, जैसा कि @ कैनन ने सवाल पर एक टिप्पणी में कहा था, शायद यह है कि आपको संपत्ति के नाम लपेटना होगा।

दर्शाता है यही वजह है कि 'सही' जवाब (पहले ही उल्लेख किया है: 1, 2) (यदि आप मैन्युअल क्रमानुसार करने की जरूरत है) JSON.NET की तरह एक मौजूदा serializer का उपयोग करें या नेट इसे संभाल (जैसे कि यह सबसे में करता है "बताने के लिए है ऑब्जेक्ट को वापस लौटकर हाल ही में "पुनरावृत्तियों)।

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