c# - मैं एक सी#अज्ञात प्रकार को JSON स्ट्रिंग में क्रमबद्ध कैसे करूं?




anonymous-types (5)

मैं अज्ञात प्रकार को जेएसओएन को क्रमबद्ध करने के लिए निम्न कोड का उपयोग करने का प्रयास कर रहा हूं:

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 Framework दस्तावेज़ देखें।

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


DataContractJsonSerializer के बजाय JavaScriptSerializer आज़माएं

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

आप मेरे JsonSerializer को आजमा सकते हैं, यह फिलहाल सबसे तेज़ .NET JSON serializer है । यह डाटाकंट्रैक्ट को क्रमबद्ध करने का समर्थन करता है, किसी भी पॉको प्रकार, इंटरफेस, लेट-बाउंड ऑब्जेक्ट्स जिनमें अनाम प्रकार आदि शामिल हैं।

मूल उदाहरण

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

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


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

[System.Web.Script.Services.ScriptService]

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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


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

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


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




anonymous-types