JSON पर एक सूची का सीरियल करना


182

मेरे पास एक ऑब्जेक्ट मॉडल है जो इस तरह दिखता है:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

संपत्ति ObjectInJsonपहले से ही अनुक्रमित संस्करण एक ऑब्जेक्ट है जिसमें नेस्टेड सूचियां होती हैं। फिलहाल, मैं MyObjectInJsonमैन्युअल रूप से इस तरह की सूची को क्रमबद्ध कर रहा हूं :

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और समान परिणाम प्राप्त कर सकता हूं । यह मैं कैसे करूंगा?

धन्यवाद।


ध्यान दें कि एक WPF प्रोजेक्ट में, आपको System.Web.Extensionsउपयोग करने के लिए एक संदर्भ जोड़ना होगा System.Web.Script.Serialization: stackoverflow.com/a/18746092/1599699 stackoverflow.com/a/19299695/1599699
एंड्रयू

जवाबों:


338

अगर .net Core 3.0 या बाद का उपयोग कर रहे हैं;

अंतर्निहित System.Text.Jsonपार्सर कार्यान्वयन का उपयोग करने के लिए डिफ़ॉल्ट ।

जैसे

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

वैकल्पिक रूप से, अन्य, कम मुख्यधारा के विकल्प Utf8Json पार्सर और जिल की तरह उपलब्ध हैं : ये बेहतर प्रदर्शन की पेशकश कर सकते हैं , अगर आपको वास्तव में इसकी आवश्यकता है लेकिन, आपको उनके संबंधित पैकेज स्थापित करने की आवश्यकता होगी।

यदि .Net कोर 2.2 या पहले का उपयोग करते हुए अटक गया;

अपनी पहली पसंद JSON Parser के रूप में Newtonsoft JSON.Net का उपयोग करने के लिए डिफ़ॉल्ट।

जैसे

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

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

PM> Install-Package Newtonsoft.Json

अधिक जानकारी के लिए उस उत्तर को देखें और बढ़ाएं जो इस जानकारी का स्रोत है

केवल संदर्भ के लिए, यह मूल उत्तर था, कई साल पहले;

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

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

1
आह ठीक है, यह भी वस्तुओं की सूची serializes और न सिर्फ खुद वस्तुओं। धन्यवाद।
फ्रेंची

चक्रीय रिश्तों को पसंद नहीं करता है, लेकिन यह एक समस्या नहीं है
जोडरेल

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

1
मैं आपका संपादित उत्तर देखता हूं और वास्तव में चाहता हूं कि मेरे पास एक अद्यतन उदाहरण है।
डायलन ब्रैम

1
@ IamNumber5 पहले से ही दूसरे उत्तर में प्रदान किया गया है। मैंने अपना जवाब वैसे भी बढ़ाया।
जोडल

111

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

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

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

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

PM> Install-Package Newtonsoft.Json

दस्तावेज़ीकरण: सीरियल का संग्रह करना


12

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

  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;}
    }

5
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;
        }

4

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

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

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

        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 उत्पन्न करने के तरीके पर बहुत बेहतर नियंत्रण प्रदान करता है। यह बहुत ही काम आएगा जब आपको जावास्क्रिप्ट-फ्रेंडली नामों को .NET क्लासेस को फॉर्मेट करना होगा, फॉर्मेट डेट टू जोंस आदि।

एक अन्य विकल्प ServiceStack.Text , ServicStack ... स्टैक का हिस्सा है , जो Json, JSV और CSV के लिए बहुत तेज़ धारावाहिकों का एक सेट प्रदान करता है।


0

एक और पोस्टिंग से एक उत्तर पर निर्माण .. मैं एक सूची बनाने के लिए एक अधिक सामान्य तरीके के साथ आया हूं, Json.NET संस्करण 12.x के साथ गतिशील पुनर्प्राप्ति का उपयोग करना

using Newtonsoft.Json;

static class JsonObj
{
    /// <summary>
    /// Deserializes a json file into an object list
    /// Author: Joseph Poirier 2/26/2019
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static List<T> DeSerializeObject<T>(string fileName)
    {
        List<T> objectOut = new List<T>();

        if (string.IsNullOrEmpty(fileName)) { return objectOut; }

        try
        {
            // reading in full file as text
            string ss = File.ReadAllText(fileName);

            // went with <dynamic> over <T> or <List<T>> to avoid error..
            //  unexpected character at line 1 column 2
            var output = JsonConvert.DeserializeObject<dynamic>(ss);

            foreach (var Record in output)
            {
                foreach (T data in Record)
                {
                    objectOut.Add(data);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
            Console.Write(ex.Message);
        }

        return objectOut;
    }
}

प्रक्रिया के लिए कॉल करें

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
}

या इस प्रक्रिया को कॉल करें

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = new List<string>();
        jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.