JSON

2012-02-02 18 views
115

के लिए एक सूची Serializing मैंने किसी चीज़ का मॉडल है कि इस तरह दिखता है। क्षण के लिए, मैं मैन्युअल MyObjectInJson की सूची serializing कर रहा हूँ इस तरह:JSON

StringBuilder TheListBuilder = new StringBuilder(); 

TheListBuilder.Append("["); 
int TheCounter = 0; 

foreach (MyObjectInJson TheObject in TheList) 
{ 
    TheCounter++; 
    TheListBuilder.Append(TheObject.ObjectInJson); 

    if (TheCounter != TheList.Count()) 
    { 
    TheListBuilder.Append(","); 
    } 
} 
TheListBuilder.Append("]"); 

return TheListBuilder.ToString(); 

मुझे आश्चर्य है कि अगर मैं JavascriptSerializer के साथ खतरनाक कोड की इस तरह की जगह और एक ही परिणाम प्राप्त कर सकते हैं। मैं यह कैसे करूँगा?

धन्यवाद।

उत्तर

220
// you need to reference System.Web.Extensions 

using System.Web.Script.Serialization; 

var jsonSerialiser = new JavaScriptSerializer(); 
var json = jsonSerialiser.Serialize(aList); 

कृपया ध्यान दें:

टाइम्स बदल दिया है, मैं JSON.Net मेरी पहली पसंद JSON पार्सर के रूप में प्रयोग के लिए डिफ़ॉल्ट होगा। यदि यह वेबएपीआई के लिए सही विकल्प है, तो यह मेरे लिए सही विकल्प है।

उदा।

using Newtonsoft.Json; 

var json = JsonConvert.SerializeObject(aList); 

आपको पहले पैकेज को स्थापित करने की आवश्यकता हो सकती है।

PM> Install-Package Newtonsoft.Json 

अधिक जानकारी के लिए see and upvote the answer that is the source of this information

+1

आह ठीक है, यह ऑब्जेक्ट्स की सूचियों को क्रमबद्ध करता है और न केवल ऑब्जेक्ट्स। धन्यवाद। – frenchie

+0

चक्रीय संबंधों को पसंद नहीं करता है लेकिन यह कोई समस्या नहीं है – Jodrell

+12

ध्यान दें कि यह नामस्थान सिस्टम.Web.Extensions में चालाकी से दूर हो गया है। एक बार जब आप एक संदर्भ के रूप में जोड़ते हैं, तो समाधान शानदार ढंग से काम करता है! –

9

वहाँ कर रही के साथ के दो सामान्य तरीके हैं निर्मित JSON serializers:

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(TheList); 
    
  2. DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType()); 
    using (var stream = new MemoryStream()) 
    { 
        serializer.WriteObject(stream, TheList); 
        using (var sr = new StreamReader(stream)) 
        { 
         return sr.ReadToEnd(); 
        } 
    } 
    

    ध्यान दें, कि यह विकल्प परिभाषा की आवश्यकता है आपकी कक्षा के लिए डेटा अनुबंध का:

    [DataContract] 
    public class MyObjectInJson 
    { 
        [DataMember] 
        public long ObjectID {get;set;} 
        [DataMember] 
        public string ObjectInJson {get;set;} 
    } 
    
3

नेट पहले से ही System.Runtime.Serialization.Json namespace के माध्यम से बुनियादी Json क्रमबद्धता और संस्करण 3.5 के बाद से DataContractJsonSerializer वर्ग का समर्थन करता है। जैसा कि नाम का तात्पर्य है, DataContractJsonSerializer अंतिम जेसन आउटपुट बनाने के लिए आपके ऑब्जेक्ट्स में जोड़े गए किसी भी डेटा एनोटेशन को ध्यान में रखता है।

यह आसान हो सकता है यदि आपके पास पहले से ही एनोटेटेड डेटा कक्षाएं हैं जिन्हें आप एक स्ट्रीम में जेसन को क्रमबद्ध करना चाहते हैं, जैसा कि How To: Serialize and Deserialize JSON Data में वर्णित है। सीमाएं हैं लेकिन यदि आपके पास बुनियादी जरूरत है और आप अपनी परियोजना में एक और लाइब्रेरी नहीं जोड़ना चाहते हैं तो यह काफी अच्छा और तेज़ है।

निम्नलिखित कोड serializea कंसोल आउटपुट स्ट्रीम में एक सूची है। जैसा कि आप देखते हैं कि यह बिट जेसन की तुलना में अधिक वर्बोज़ है।नेट और नहीं टाइप-सुरक्षित (यानी कोई जेनरिक)

 var list = new List<string> {"a", "b", "c", "d"}; 

     using(var output = Console.OpenStandardOutput())     
     {     
      var writer = new DataContractJsonSerializer(typeof (List<string>)); 
      writer.WriteObject(output,list); 
     } 

दूसरी ओर, Json.NET कैसे आप Json उत्पन्न पर ज्यादा बेहतर नियंत्रण प्रदान करता है। यह बहुत आसान आप जावास्क्रिप्ट के अनुकूल नामों कक्षाएं नेट पर मैप करने के लिए है जब में आ जाएगा, प्रारूप JSON के लिए आदि

एक अन्य विकल्प ServiceStack.Text, ServicStack का हिस्सा ... ढेर, जिनमें से एक सेट प्रदान करता है तारीखें जेसन, जेएसवी और सीएसवी के लिए बहुत तेजी से धारावाहिक।

81

आप जेसन.NET का भी उपयोग कर सकते हैं। बस इसे http://james.newtonking.com/pages/json-net.aspx पर डाउनलोड करें, संपीड़ित फ़ाइल निकालें और इसे संदर्भ के रूप में जोड़ें।

तो बस (या जो भी वस्तु आप चाहते हैं) सूची को क्रमानुसार साथ निम्नलिखित:

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

अद्यतन: आप भी (NuGet पैकेज प्रबंधक के माध्यम से अपनी परियोजना में जोड़ सकते हैं उपकरण -> NuGet पैकेज प्रबंधक -> पैकेज प्रबंधक कंसोल):

PM> Install-Package Newtonsoft.Json 

प्रलेखन: Serializing Collections

+6

या nuget का उपयोग करें http://www.nuget.org/packages/newtonsoft.json/ – Jodrell

2
public static string JSONSerialize<T>(T obj) 
     { 
      string retVal = String.Empty; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
       serializer.WriteObject(ms, obj); 
       var byteArray = ms.ToArray(); 
       retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length); 
      } 
      return retVal; 
     }