मैं .NET में JSON स्ट्रिंग में C # ऑब्जेक्ट कैसे बदलूं?


943

मेरे पास इन जैसी कक्षाएं हैं:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

और मैं एक Ladवस्तु को इस तरह JSON स्ट्रिंग में बदलना चाहूंगा:

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(प्रारूपण के बिना)। मुझे यह लिंक मिला , लेकिन यह एक नाम स्थान का उपयोग करता है जो .NET 4 में नहीं है । मैंने JSON.NET के बारे में भी सुना है , लेकिन उनकी साइट इस समय कम लग रही है, और मैं बाहरी DLL फ़ाइलों का उपयोग करने के लिए उत्सुक नहीं हूं।

क्या मैन्युअल रूप से JSON स्ट्रिंग लेखक बनाने के अलावा अन्य विकल्प हैं ?


2
JSON.net को यहां लोड किया जा सकता है एक दूसरे और तेज़ (जैसा कि वे कहते हैं - मैंने इसे स्वयं परीक्षण नहीं किया था) समाधान ServiceStack.Text है मैं आपके खुद के JSON पार्सर को रोल करने की अनुशंसा नहीं करूंगा। यह संभवतः धीमा और अधिक त्रुटि प्रवण होगा या आपको बहुत समय निवेश करना होगा।
ज़ेबी

हाँ। C # का एक प्रकार है जिसका नाम JavaScriptSerializer है
Glenn Ferrie


2
हम्म .. जहाँ तक मैं देख सकता हूँ आप का उपयोग करने में सक्षम होना चाहिए: msdn.microsoft.com/en-us/library/… जो MSDN पृष्ठ के अनुसार .net 4.0 में भी है। आपको सीरियलाइज़ (ऑब्जेक्ट obj) विधि का उपयोग करने में सक्षम होना चाहिए: msdn.microsoft.com/en-us/library/bb292287.aspx क्या मैं यहाँ कुछ याद कर रहा हूँ? Btw। आपको लिंक कुछ कोड लगता है न कि लिंक
होल्गर

यह उल्लेख नहीं करने के लिए सिस्टम पर कोई निर्भरता नहीं है। We.Xyz नामस्थान ...
डेव जेलिसन

जवाबों:


897

आप JavaScriptSerializerवर्ग का उपयोग कर सकते हैं (संदर्भ जोड़ें System.Web.Extensions):

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

एक पूर्ण उदाहरण:

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

95
कृपया ध्यान रखें कि Microsoft इस समाधान के बजाय JSON.net का उपयोग करने का सुझाव देता है। मुझे लगता है कि यह उत्तर अनुचित हो गया। विस्टेल के उत्तर पर एक नज़र डालें। स्रोत: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
रेज़लेक

9
@DarinDimitrov आपको JSON.net के बारे में संकेत जोड़ने पर विचार करना चाहिए। माइक्रोसॉफ्ट JavascriptSerializer पर सलाह देता है: msdn.microsoft.com/en-us/library/... तुम भी करने के लिए एक संकेत जोड़ सकता है msdn.microsoft.com/en-us/library/... जो ढांचा शामिल दृष्टिकोण है
Mafii

यहाँ है ऑनलाइन उपकरण अपने कन्वर्ट करने के classesलिए jsonप्रारूप, आशा किसी को मदद मिलती है।
शैजुत

6
Microsoft अपने दम पर एक 3 पार्टी समाधान की सिफारिश क्यों करेगा? उनका शब्दांकन बहुत ही अजीब है: "Json.NET का उपयोग क्रमांकन और डीरिएलाइज़ेशन के लिए किया जाना चाहिए। AJAX- सक्षम अनुप्रयोगों के लिए क्रमांकन और डीरिएलाइज़ेशन कार्यक्षमता प्रदान करता है।"
एक रक्षक

1
संदर्भ के लिए System.Web.Extensions, आप अपने सिस्टम पर स्थापित ASP.NET AJAX 1.0या ASP.NET 3.5स्थापित होना चाहिए । कृपया इस stackoverflow.com/questions/7723489/…
सिसिर

1054

चूंकि हम सभी वन-लाइनर्स से प्यार करते हैं

... यह एक न्यूटनसॉफ्ट नूगेट पैकेज पर निर्भर करता है, जो डिफ़ॉल्ट धारावाहिक से लोकप्रिय और बेहतर है।

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

प्रलेखन: सीरियल और वर्णन करना JSON


134
Newtonsoft serializer जिस तरह से तेज और mor अनुकूलन योग्य है, उसके बाद बनाया गया है। अत्यधिक इसका उपयोग करने की सलाह देते हैं। उत्तर के लिए धन्यवाद @willsteel
आंद्रेई

8
@JosefPfleger मूल्य निर्धारण JSON.NET स्कीमा के लिए है, JSON.NET नियमित धारावाहिक के लिए नहीं, जो MIT है
डेविड 19

1
मेरे परीक्षण से पता चला कि न्यूटनसॉफ्ट, JavaScriptSerializer वर्ग की तुलना में धीमा है। (.NET 4.5.2)
नीमके

31
यदि आप जावास्क्रिप्ट डेटाबेस के लिए MSDN प्रलेखन पढ़ते हैं , तो यह कहता है कि JSON.net का उपयोग करें।
dsghi

3
@JosefPfleger Newtionsoft JSON.net MIT लाइसेंस प्राप्त है ... आप संशोधन कर सकते हैं और इसे फिर से बेचना चाहते हैं। उनका मूल्य निर्धारण पृष्ठ वाणिज्यिक तकनीकी सहायता और उनके पास कुछ स्कीमा सत्यापनकर्ता के बारे में है।
cb88

95

Json.Net लाइब्रेरी का उपयोग करें , आप इसे Nuget पैकेट मैनेजर से डाउनलोड कर सकते हैं।

Json स्ट्रिंग के लिए सीरियल:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

वस्तु का वर्णन:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

57

DataContractJsonSerializerवर्ग का उपयोग करें : MSDN1 , MSDN2

मेरा उदाहरण: यहाँ

यह विपरीत रूप से एक JSON स्ट्रिंग से ऑब्जेक्ट को सुरक्षित रूप से डीसर्विलाइज़ भी कर सकता है JavaScriptSerializer। लेकिन व्यक्तिगत रूप से मैं अभी भी Json.NET पसंद करता हूं


1
फिर भी उस पृष्ठ पर कोई उदाहरण नहीं दिखता है , लेकिन यहाँ MSDN और अन्य जगहों पर कुछ हैं -> अंतिम एक-लाइनर्स को प्राप्त करने के लिए विस्तार विधियों का उपयोग करता है।
क्रिस्टियन डायकोन्स्कु

ओह, मुझे दूसरा MSDN लिंक याद आया :)
क्रिस्टियन डियाकोन्सकु

2
यह सादे वर्गों को क्रमबद्ध नहीं करता है। रिपोर्ट की गई त्रुटि "DataContractAttribute विशेषता के साथ इसे चिह्नित करने पर विचार करें, और इसके सभी सदस्यों को चिह्नित करें जिन्हें आप DataMemberAttribute विशेषता के साथ क्रमबद्ध करना चाहते हैं। यदि प्रकार एक संग्रह है, तो इसे CollectionDataontontractAttribute के साथ चिह्नित करने पर विचार करें।"
माइकल फ्रीजिम

@MichaelFreidgeim यह सही है, आपको उस वर्ग में गुणों को चिह्नित करना होगा जिसे आप विशेषताओं के साथ क्रमबद्ध करना चाहते हैं। DataContractAttribute DataMemberAttribute
Edgar

1
@MichaelFreidgeim जो बेहतर है आवश्यकताओं पर निर्भर करता है। गुण आपको कॉन्फ़िगर करते हैं कि संपत्ति कैसे क्रमबद्ध है।
एडगर

24

आप न्यूटनसॉफ्ट.जसन का उपयोग करके इसे प्राप्त कर सकते हैं। NuGet से Newtonsoft.json स्थापित करें। और तब:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

Wooou! JSON फ्रेमवर्क का उपयोग करके वास्तव में बेहतर है :)

यहाँ Json.NET ( http://james.newtonking.com/json ) का उपयोग करके मेरा उदाहरण दिया गया है :

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

कसौटी:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

परिणाम:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

अब मैं कंस्ट्रक्टर विधि को लागू करूंगा जो JSON स्ट्रिंग प्राप्त करेगा और क्लास के फ़ील्ड को पॉप्युलेट करेगा।


1
अच्छा पोस्ट, यह इसे करने का सबसे वर्तमान तरीका है।
मैथ्यू

20

नाम में एक नया JSON धारावाहिक उपलब्ध है System.Text.Json। यह .NET कोर 3.0 साझा ढांचे में शामिल है और उन परियोजनाओं के लिए एक NuGet पैकेज में है जो .NET मानक या .NET फ्रेमवर्क या .NET कोर 2.200. लक्ष्य करते हैं।

उदाहरण कोड:

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

इस उदाहरण में क्रमबद्ध होने वाली कक्षाओं में खेतों के बजाय गुण होते हैं; System.Text.Jsonserializer वर्तमान में नहीं serialize क्षेत्रों करता है।

प्रलेखन:


9

यदि वे बहुत बड़े नहीं हैं, तो संभवतः आपका मामला JSON के रूप में क्या निर्यात करता है।

इसके अलावा यह सभी प्लेटफार्मों के बीच पोर्टेबल बनाता है।

using Newtonsoft.Json;

[TestMethod]
public void ExportJson()
{
    double[,] b = new double[,]
        {
            { 110,  120,  130,  140, 150 },
            {1110, 1120, 1130, 1140, 1150},
            {1000,    1,   5,     9, 1000},
            {1110,    2,   6,    10, 1110},
            {1220,    3,   7,    11, 1220},
            {1330,    4,   8,    12, 1330}
        };

    string jsonStr = JsonConvert.SerializeObject(b);

    Console.WriteLine(jsonStr);

    string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

    File.WriteAllText(path, jsonStr);
}

8

यदि आप ASP.NET MVC वेब कंट्रोलर में हैं तो यह उतना ही सरल है:

string ladAsJson = Json(Lad);

विश्वास नहीं कर सकता कि किसी ने भी इसका उल्लेख नहीं किया है।


1
मुझे एक त्रुटि मिलती है कि स्ट्रिंग में jsonresult डालने में सक्षम नहीं है।
csga5000 5

यह अंतर्निहित टाइपिंग के साथ संकलित करेगा: var ladAsJson = Json (Lad)।
ईवोमैक

3

मैं ServiceStack के JSON सीरियल के लिए मतदान करूंगा:

using ServiceStack.Text

string jsonString = new { FirstName = "James" }.ToJson();

यह .NET के लिए उपलब्ध सबसे तेज JSON धारावाहिक भी है: http://www.servicestack.net/benchmark/


4
वे बहुत पुराने बेंचमार्क हैं। मैंने अभी-अभी Newtonsoft, ServiceStack और JavaScriptSerializer के सभी तीन वर्तमान संस्करणों का परीक्षण किया है और वर्तमान में Newtonsoft सबसे तेज़ है। थो वे सभी काफी तेजी से करते हैं।
माइकल लोगुटोव

1
ServiceStack मुक्त प्रतीत नहीं होता है।
joelnet

@joelnet यह अब मामला है, लेकिन सवाल का जवाब देते समय स्वतंत्र था। हालांकि यह छोटी साइटों के लिए स्वतंत्र है, और मैं अभी भी इसका उपयोग कर रहा हूं, भले ही इसका भुगतान किया जाए, यह एक शानदार ढांचा है।
जेम्स

यहाँ कुछ बेंचमार्क, हालाँकि अपने आप में क्रमांकन के लिए गैर है: docs.servicestack.net/real-world-performance
JohnLevan

3

XML को JSON में कनवर्ट करने के लिए नीचे दिए गए कोड का उपयोग करें।

var json = new JavaScriptSerializer().Serialize(obj);


3

यह उतना ही आसान है (यह गतिशील वस्तुओं के लिए भी काम करता है) (प्रकार वस्तु):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

वेब के तहत कोई डिफ़ॉल्ट स्क्रिप्ट नहीं है। :(
M

आप इसके लिए देख रहे हैं: msdn.microsoft.com/en-us/library/…
MarzSocks

मैंने उस तरह की कोशिश की लेकिन नहीं। स्क्रिप्ट मुझे लगता है कि मुझे इसे संदर्भ के रूप में जोड़ना चाहिए। इसलिए बहुत बहुत धन्यवाद
M

0

serializer

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

वस्तु

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

कार्यान्वयन

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

उत्पादन

{
  "AppSettings": {
    "DebugMode": false
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.