मैं JSON स्ट्रिंग में C # अनाम प्रकार को कैसे अनुक्रमित करूं?


162

मैं JSON का एक अनाम प्रकार अनुक्रमित करने के लिए निम्न कोड का उपयोग करने का प्रयास कर रहा हूं:

var serializer = new DataContractJsonSerializer(thing.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, thing);
var json = Encoding.Default.GetString(ms.ToArray()); 

हालाँकि, यह निष्पादित होने पर मुझे निम्न अपवाद मिलते हैं:

टाइप करें '<> f__AnonymousType1`3 [System.Int32, System.Int32, System.Object []] को क्रमबद्ध नहीं किया जा सकता है। DataContractAttribute विशेषता के साथ इसे चिह्नित करने पर विचार करें, और इसके सभी सदस्यों को चिह्नित करें जिन्हें आप DataMemberAttribute विशेषता के साथ क्रमबद्ध करना चाहते हैं। अन्य समर्थित प्रकारों के लिए Microsoft .NET फ्रेमवर्क प्रलेखन देखें।

मैं एक अनाम प्रकार (जहां तक ​​मुझे पता है) में विशेषताओं को लागू नहीं कर सकता। क्या इस धारावाहिक को करने का एक और तरीका है या मैं कुछ याद कर रहा हूं?

जवाबों:


159

DataContractJsonSerializer की जगह JavaScriptSerializer आज़माएं

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);

17
Trackback, ऐसा लगता है कि यह SP1 में de-deprecated था।
बिस्वनाथ

7
ऐसा कुछ देखने के लिए, यह MVC सहित कई नए Microsoft फ्रेमवर्क में उपयोग किया जा रहा है। aspnet.codeplex.com/SourceControl/changeset/view/21528#266491
Nick Berardi

1
मैं इस ia non-asp.net प्रोजेक्ट (कंसोल एप्लिकेशन) को कैसे शामिल करूं?
एलेक्ज़ेंडर जूल

4
@ एलेक्ज़ेंडर: आपको संदर्भ System.Web.Extensions.dllऔर एक using System.Web.Script.Serialization;बयान जोड़ना होगा ।
randomguy

1
@randomgui समस्या प्रोजेक्ट आउटपुट प्रकार क्लाइंट-प्रोफ़ाइल पर सेट की गई थी।
22

75

जैसा कि दूसरों ने उल्लेख किया है, न्यूटनसॉफ्ट JSON.NET एक अच्छा विकल्प है। यहाँ सरल JSON क्रमांकन के लिए एक विशिष्ट उदाहरण है:

return JsonConvert.SerializeObject(
    new
    {
       DataElement1,
       SomethingElse
    });

मैंने इसे बहुत लचीला, बहुमुखी पुस्तकालय पाया है।


14

आप मेरा ServiceStack JsonSerializer आज़मा सकते हैं यह इस समय का सबसे तेज़ .NET JSON धारावाहिक है । यह DataContract, Any POCO Type, Interfaces, लेट-बाउंड ऑब्जेक्ट्स जैसे गुमनाम प्रकार आदि को क्रमबद्ध करने का समर्थन करता है।

मूल उदाहरण

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 

नोट: यदि आप प्रदर्शन के लिए महत्वपूर्ण नहीं हैं, तो केवल माइक्रोसॉफ़्ट जावास्क्रिप्टस्लीयराइज़र का उपयोग करें क्योंकि मुझे अपने बेंचमार्क से बाहर निकलना पड़ा है क्योंकि अन्य JSON धारावाहिकों की तुलना में यह 40x-100x धीमा है।


7
मैं एमवीसी 3 स्टैक पर एमएस JavaScriptSerializer का उपयोग कर रहा हूं ताकि छोटी मात्रा में डेटा के साथ वस्तुओं को अनुक्रमित किया जा सके। यह इन मामलों में बहुत तेज़ है, जो मुझे चाहिए वह करने के लिए एक मिलीसेकंड से कम समय ले रहा है। DB क्वेरी अपने आप में 50x-100x अधिक समय लेती है, इसलिए यह वास्तव में मेरी स्थिति में एक महत्वपूर्ण अड़चन नहीं है।
ब्रायन

2
समयपूर्व अनुकूलन एक ... अच्छी तरह से आप जानते हैं।
मथियास लिकेगार्ड लोरेनजेन

1
"सबसे तेज .NET JSON सीरीयल" लिंक 404ing है! साथ ही, यह उत्तर 5 1/2 वर्ष से अधिक पुराना है। क्या आपके पास विभिन्न .NET JSON धारावाहिकों के प्रदर्शन पर अपडेट है?
एरिक

11

कृपया ध्यान दें कि यह 2008 से है। आज मैं तर्क दूंगा कि धारावाहिक का निर्माण किया जाना चाहिए और आप उपभोक्ताओं को अपने समापन बिंदु और वापसी डेटा के बारे में सूचित करने के लिए शायद स्वैगर + विशेषताओं का उपयोग कर सकते हैं।


Iwould का तर्क है कि आपको एक अनाम प्रकार को क्रमबद्ध नहीं करना चाहिए । मुझे यहाँ का मोह मालूम है; आप जल्दी से कुछ फेंक-दूर प्रकार उत्पन्न करना चाहते हैं जो कि ब्राउज़र में शिथिल प्रकार के वातावरण उर्फ ​​जावास्क्रिप्ट में उपयोग किए जाने वाले हैं। फिर भी, मैं एक वास्तविक प्रकार बनाऊंगा और इसे सीरियलाइज़ के रूप में सजाऊंगा। तब आप दृढ़ता से अपने वेब तरीके टाइप कर सकते हैं। जबकि यह जावास्क्रिप्ट के लिए एक iota से कोई फर्क नहीं पड़ता, यह विधि में कुछ स्व-प्रलेखन जोड़ता है। किसी भी कारण से अनुभवी प्रोग्रामर फ़ंक्शन सिग्नेचर को देख पाएगा और कहेगा, "ओह, यह टाइप फू है! मुझे पता है कि इसे JSON में कैसे देखना चाहिए।"

कहा जा रहा है कि, आप क्रमांकन करने के लिए JSON.Net की कोशिश कर सकते हैं । मुझे पता नहीं है कि यह काम करेगा


3
JSON.Net ठीक काम करता है। मेरा तर्क है कि आपको :) नहीं होना चाहिए, मुझे लगता है कि यह कई मामलों में बहुत वैध है।
aprilchild

2
एमवीसी में "थ्रो दूर" प्रकारों को देखने के बाद मैं कुछ सम्मोहक उपयोग देख सकता हूं। मुझे लगता है कि यह एक बहुत ही उपयोगी उपकरण है आपके .net टूल बॉक्स में।
मैथ्यू Whited

12
यह एक ऐसा बिंदु है जिस पर मैं नरम पड़ गया हूं, विशेष रूप से केवल-उपभोग के प्रकार के मामले में। लेकिन अगर ऑब्जेक्ट सर्वर पर वापसी यात्रा कर रहा है, या एक से अधिक स्थानों में उपयोग किया जाता है, तो मैं अभी भी मानता हूं कि एक प्रकार का निर्माण कम समस्याओं का परिणाम होगा।
जेसन जैक्सन

DataContract शैली डी-क्रमांकन बहुरूपी प्रकार को अच्छी तरह से संभाल नहीं करता है। आपको अपना डे-सीरियल लिखना होगा। बहुत कोड रखरखाव।
माईकओवर

एक उपयोग का मामला जहां अनाम प्रकारों को क्रमबद्ध करना उपयोगी है, वेब एपीआई के लिए इकाई परीक्षण है।
Howcheng

9

सबसे तेज़ तरीका मुझे यह मिला:

var obj = new {Id = thing.Id, Name = thing.Name, Age = 30};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(obj);

नामस्थान: System.Web.Script.Serialization.JavaScriptSerializer


2
और डिसेरिएलाइज़ेशन के लिए:। । डायनामिक myObject = JsonConvert.DeserializeObject <डायनेमिक> (आउटपुट); । । संदर्भ: न्यूटनसॉफ्ट.जॉन.डेल
आई ३ एनएन

2

आप Newtonsoft.Json का उपयोग कर सकते हैं।

var warningJSON = JsonConvert.SerializeObject(new {
                warningMessage = "You have been warned..."
            });

1

मान लें कि आप इसे वेब सेवा के लिए उपयोग कर रहे हैं, तो आप निम्न विशेषता को कक्षा में लागू कर सकते हैं:

[System.Web.Script.Services.ScriptService]

फिर प्रत्येक विधि के लिए निम्नलिखित विशेषता जो Json को लौटाना चाहिए:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

और "ऑब्जेक्ट" होने के तरीकों के लिए वापसी प्रकार सेट करें


एक मानक एएसपी वेब सेवा के लिए [ScriptMethod (ResponseFormat = ResponseFormat.Json)] की विधि की आवश्यकता नहीं है, [WebMethod] करेगा। इसके अलावा, आपको रिटर्न प्रकार को ऑब्जेक्ट पर सेट नहीं करना चाहिए, यह गैर-जटिल (यानी क्रमबद्ध किया जा सकता है) प्रकार के साथ दृढ़ता से टाइप किया जाना चाहिए।
row1

-1
public static class JsonSerializer
{
    public static string Serialize<T>(this T data)
    {
        try
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream();
            serializer.WriteObject(stream, data);
            string jsonData = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length);
            stream.Close();
            return jsonData;
        }
        catch
        {
            return "";
        }
    }
    public static T Deserialize<T>(this string jsonData)
    {
        try
        {
            DataContractJsonSerializer slzr = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
            T data = (T)slzr.ReadObject(stream);
            stream.Close();
            return data;
        }
        catch
        {
            return default(T);
        }
    }
}

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