JSON ऑब्जेक्ट को कस्टम C # ऑब्जेक्ट में कैसे बदलें?


247

क्या AJAX के माध्यम से पारित JSON वस्तु के साथ मेरे C # ऑब्जेक्ट को आबाद करने का एक आसान तरीका है?

यह JSON.stringify पेज का उपयोग करके C # WEBMETHOD को दिया गया JSON ऑब्जेक्ट है

{
    "user": {
        "name": "asdf",
        "teamname": "b",
        "email": "c",
        "players": ["1", "2"]
    }
}

C # WebMetod जो JSON ऑब्जेक्ट को प्राप्त करता है

[WebMethod]
public static void SaveTeam(Object user)
{

}

C # क्लास जो WebMethod में पारित JSON ऑब्जेक्ट की ऑब्जेक्ट संरचना का प्रतिनिधित्व करता है

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

69
यह जोड़ना चाहते हैं कि आप json2csharp.com का उपयोग करके आपके लिए अपनी सी # कक्षाएं उत्पन्न कर सकते हैं । पूर्ण प्रकटीकरण: मैंने यह साइट बनाई है।
JonathanK


@JonathanK तुम मेरे तारणहार हो!
मथेनो

जवाबों:


218

JSON को C # में उपयोग करने का एक अच्छा तरीका JSON.NET है

JSON.NET से त्वरित शुरुआत और एपीआई प्रलेखन - आधिकारिक साइट आपको इसके साथ काम करने में मदद करती है।

इसका उपयोग कैसे करें का एक उदाहरण:

public class User
{
    public User(string json)
    {
        JObject jObject = JObject.Parse(json);
        JToken jUser = jObject["user"];
        name = (string) jUser["name"];
        teamname = (string) jUser["teamname"];
        email = (string) jUser["email"];
        players = jUser["players"].ToArray();
    }

    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

// Use
private void Run()
{
    string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c"",""players"":[""1"",""2""]}}";
    User user = new User(json);

    Console.WriteLine("Name : " + user.name);
    Console.WriteLine("Teamname : " + user.teamname);
    Console.WriteLine("Email : " + user.email);
    Console.WriteLine("Players:");

    foreach (var player in user.players)
        Console.WriteLine(player);
 }

5
यह एक विजेता की तरह काम करता है, लेकिन क्या होगा अगर मेरे पास कई वस्तुएं हैं जो मेरे पास हैं और मैं एक वस्तु सूची बनाना चाहता हूं?
जिरेन

@ डर्जोर्न: मैं इसके लिए दो तरीके देखता हूं। यदि आइटम समूहीकृत नहीं हैं, तो स्ट्रिंग को विभाजित करने का एक तरीका खोजने की कोशिश करें एक लूप में प्रक्रिया को दोहराएं। यदि उन्हें समूहीकृत किया जाता है तो वे ऑब्जेक्ट का एक ऑब्जेक्ट बनाते हैं
user1011138

1
मैं अन्य उत्तरों में उल्लिखित एक लाइनर को पसंद करता हूं .. IMHO।
RayLoveless

हाँ यह एक अच्छा तरीका नहीं है, DeserializeObject का उपयोग करने वाला नीचे बहुत साफ है
एंड्रयू

209

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

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

अगर हमारे पास कक्षा है तो नीचे का उपयोग करें।

Mycustomclassname oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<Mycustomclassname>(jsonString);

कोई वर्ग तो गतिशील का उपयोग करें

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);

95

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

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

आपको ज़रूरत होगी:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;

@ChristianPayne हा! अच्छी बात है, हाँ ये लपेटे जाने चाहिए। इस पर नज़र रखने के साथ, बस JSON.NET का उपयोग करें!
जैमिन

2
यदि DataContractJsonSerializer वर्ग दिखाई नहीं देता है, तो आपको समाधान में संदर्भ पर राइट क्लिक करके System.Runtime.Serialization को जोड़ना होगा। .NET टैब का चयन करें और System.Runtime.Serialization
DanKodi

1
एक परिदृश्य जहां यह टूट जाता है। यदि आपकी JSON ऑब्जेक्ट एकल कोट्स के साथ गुणों का प्रतिनिधित्व करती है, तो यह फ़ंक्शन विफल हो जाता है। उदाहरण के लिए, यह {"विषय": 'ईमेल: वेब उपयोगकर्ता गतिविधि लॉग 11', 'एंबेडैम्सइमेज': सत्य} को पार्स करने में सक्षम नहीं था, लेकिन यह {"विषय" को पार्स करने में सक्षम था: "ईमेलिंग: वेब उपयोगकर्ता गतिविधि लॉग 11," एंबैसइमेज " : सच}
स्वप्नकुमार

इसके अलावा मुझे अपने सरल वर्ग को डेटाकंट्रेक्ट और डेटामेम्बर विशेषताओं के साथ सजाने की आवश्यकता थी। यह इसके बिना पार्स नहीं होगा।
स्वप्नकुमार

विशाल के विपरीत, एक POCO वर्ग ने मेरे लिए पूरी तरह से काम किया ... +1 क्योंकि यह JSON.NET पर निर्भरता से बचा जाता है।
डनक

54

आपके कोड नमूने को देखते हुए, आपको कुछ और करने की आवश्यकता नहीं होनी चाहिए।

यदि आप उस JSON स्ट्रिंग को अपनी वेब विधि से पास करते हैं, तो यह स्वचालित रूप से JSON स्ट्रिंग को पार्स कर देगा और आपके SaveTeam विधि के पैरामीटर के रूप में एक पॉप्युलेटेड उपयोगकर्ता ऑब्जेक्ट बना देगा।

आम तौर पर यद्यपि, आप JavascriptSerializerनीचे दिए गए वर्ग का उपयोग कर सकते हैं , या अधिक लचीलेपन के लिए, वहाँ से बाहर विभिन्न Json चौखटे का उपयोग कर सकते हैं (Jayrock JSON एक अच्छा एक है) आसान JSON हेरफेर के लिए।

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 

1
मुझे लगता है कि आपको एक ienumerable प्रकार का उपयोग करना चाहिए (इसलिए इस उदाहरण में सूची <User>)
Dragouf

यदि यह उप-दृश्य मॉडल
श्रीनिवासनडयूर

1
उन की तलाश के लिए आप संदर्भ के लिए की जरूरत है System.Web.Extensionsविधानसभा और एक जोड़ने using System.Web.Script.Serializationपर प्राप्त करने के लिए JavaScriptSerializer, लेकिन एक बार आप ऐसा करेंगे, यह स्पष्ट तरीका तुम्हारा deserialize करने के लिए की तरह लगता है jsonग # ठोस वर्गों में तार।
सर्ज सगुन

41

एक और वास्तव में सरल समाधान पुस्तकालय Newtonsoft.Json का उपयोग कर रहा है:

User user = JsonConvert.DeserializeObject<User>(jsonString);

लेकिन अगर उपयोगकर्ता के पास संपत्ति में एक और JSon डेटा है, तो यह विफल हो जाएगा ...
gumuruh

@gumuruh मुझे लगता है कि मैं आपके बयान को समझ नहीं पाया। यदि आपके पास एक जटिल वस्तु है चुड़ैल गुण एक और जटिल वस्तु हैं, तो वे भी परिवर्तित हो जाएंगे, जब तक कि आपके जोंस स्ट्रिंग में डेटा सही ढंग से न हो।
डैनियल

33

निम्नलिखित 2 उदाहरण या तो उपयोग करते हैं

  1. प्रणाली के तहत JavaScriptSerializer .eb.Script.Serialization या
  2. Json.Decode के तहत System.Web.Helpers

उदाहरण 1: System.Web.Script.Serialization का उपयोग करना

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void Test()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            dynamic jsonObject = serializer.Deserialize<dynamic>(json);

            dynamic x = jsonObject["user"]; // result is Dictionary<string,object> user with fields name, teamname, email and players with their values
            x = jsonObject["user"]["name"]; // result is asdf
            x = jsonObject["user"]["players"]; // result is object[] players with its values
        }
    }
}

उपयोग: JSON कस्टम C # ऑब्जेक्ट पर

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Script.Serialization;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJavaScriptSerializer()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            var jsonObject = serializer.Deserialize<dynamic>(json);
            name = (string)jsonObject["user"]["name"];
            teamname = (string)jsonObject["user"]["teamname"];
            email = (string)jsonObject["user"]["email"];
            players = jsonObject["user"]["players"];
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

उदाहरण 2: System.Web.Helpers का उपयोग करना

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            dynamic jsonObject = Json.Decode(json);

            dynamic x = jsonObject.user; // result is dynamic json object user with fields name, teamname, email and players with their values
            x = jsonObject.user.name; // result is asdf
            x = jsonObject.user.players; // result is dynamic json array players with its values
        }
    }
}

उपयोग: JSON कस्टम C # ऑब्जेक्ट पर

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Helpers;
using System.Linq;

namespace Tests
{
    [TestClass]
    public class JsonTests
    {
        [TestMethod]
        public void TestJsonDecode()
        {
            var json = "{\"user\":{\"name\":\"asdf\",\"teamname\":\"b\",\"email\":\"c\",\"players\":[\"1\",\"2\"]}}";
            User user = new User(json);
            Console.WriteLine("Name : " + user.name);
            Console.WriteLine("Teamname : " + user.teamname);
            Console.WriteLine("Email : " + user.email);
            Console.WriteLine("Players:");
            foreach (var player in user.players)
                Console.WriteLine(player);
        }
    }

    public class User {
        public User(string json) {
            var jsonObject = Json.Decode(json);
            name = (string)jsonObject.user.name;
            teamname = (string)jsonObject.user.teamname;
            email = (string)jsonObject.user.email;
            players = (DynamicJsonArray) jsonObject.user.players;
        }

        public string name { get; set; }
        public string teamname { get; set; }
        public string email { get; set; }
        public Array players { get; set; }
    }
}

इस कोड को System.Web जोड़ने की आवश्यकता है।

% ProgramFiles% \ Microsoft ASP.NET \ ASP.NET वेब पेज {VERSION} \ Assemblies \ System.Web.Helersersll.ll

या

% ProgramFiles (x86)% \ Microsoft ASP.NET \ ASP.NET वेब पेज {संस्करण} \ Assemblies \ System।

उम्मीद है की यह मदद करेगा!


यह एक बहुत अच्छा जवाब है, लेकिन मुश्किल बात यह है कि dynamicप्रकारों के साथ , आपको कोई भी सही प्रकार की जाँच नहीं मिलती है। उदाहरण के लिए, यदि आपके JSON में "Name" : "Ahmed"सम्‍मिलित है और आप अपने C # कोड में "नाम" गलत लिखते हैं, तो यह रनटाइम एरर (bleh) है।
जेस

धन्यवाद! कृपया उत्तर देने के लिए उत्तर दें कि उदाहरण 1 के लिए, आपको System.Web.Extension.dll
Valamas

1
सुपर महान जवाब, गतिशील टाइपिंग w / json.net v6.0.6 भी काम करता है!
स्टैक्यूसर 83

7
public static class Utilities
{
    public static T Deserialize<T>(string jsonString)
    {
        using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {    
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            return (T)serializer.ReadObject(ms);
        }
    }
}

अधिक जानकारी के लिए निम्न लिंक पर जाएं http://ishareidea.blogspot.in/2012/05/json-conversion.html

जिनके बारे में DataContractJsonSerializer Classआप यहाँ पढ़ सकते हैं ।


5

JavaScriptSerializer () के उपयोग की पेशकश की गई जेनेरिक समाधान की तुलना में कम सख्त है: सार्वजनिक स्थैतिक T Deserialize (string json)

जब सर्वर से जसन को पास करना आसान हो सकता है जो उस ऑब्जेक्ट परिभाषा से बिल्कुल मेल नहीं खाता है जिसे आप बदलने की कोशिश कर रहे हैं।


2

प्रदर्शन के लिहाज से, मैंने सर्विसस्टैक के सीरीकेज़र को तब औरों की तुलना में थोड़ा तेज़ पाया। यह ServiceStack.Text नाम स्थान में JsonSerializer वर्ग है।

https://github.com/ServiceStack/ServiceStack.Text

ServiceStack NuGet पैकेज के माध्यम से उपलब्ध है: https://www.nuget.org/packages/ServiceStack/


1

JSON.Net आपकी सर्वश्रेष्ठ शर्त है, लेकिन वस्तुओं के आकार पर निर्भर करता है और क्या परिपत्र निर्भरताएं हैं, आप JavaScriptSerializer या DataContractSerializer का उपयोग कर सकते हैं।



1

जावास्क्रिप्ट धारावाहिक: आवश्यकता है using System.Web.Script.Serialization;

public class JavaScriptSerializerDeSerializer<T>
{
    private readonly JavaScriptSerializer serializer;

    public JavaScriptSerializerDeSerializer()
    {
        this.serializer = new JavaScriptSerializer();
    }

    public string Serialize(T t)
    {
        return this.serializer.Serialize(t);
    }

    public T Deseralize(string stringObject)
    {
        return this.serializer.Deserialize<T>(stringObject);
    }
}

डेटा कॉन्ट्रैक्ट सीरीज़ाइज़र: की आवश्यकता होती है using System.Runtime.Serialization.Json; - जेनेरिक टाइप T डेटा कॉन्ट्रैक्ट पर अधिक धारावाहिक होना चाहिए

public class JsonSerializerDeserializer<T> where T : class
{
    private readonly DataContractJsonSerializer jsonSerializer;

    public JsonSerializerDeserializer()
    {
        this.jsonSerializer = new DataContractJsonSerializer(typeof(T));
    }

    public string Serialize(T t)
    {
        using (var memoryStream = new MemoryStream())
        {
            this.jsonSerializer.WriteObject(memoryStream, t);
            memoryStream.Position = 0;
            using (var sr = new StreamReader(memoryStream))
            {
                return sr.ReadToEnd();
            }
        }
    }

    public T Deserialize(string objectString)
    {
        using (var ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes((objectString))))
        {
            return (T)this.jsonSerializer.ReadObject(ms);
        }
    }
}

0

सिर्फ एक वस्तु के रूप में भेजने के बजाय।

उन संपत्तियों का एक सार्वजनिक वर्ग बनाएं जो सुलभ है और डेटा को वेबमिथोड पर भेजते हैं।

[WebMethod]
public static void SaveTeam(useSomeClassHere user)
{
}

डेटा भेजने के लिए अजाक्स कॉल में समान पैरामीटर नामों का उपयोग करें।

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