2009-09-07 6 views
32

मैं कुछ इकाई ऑब्जेक्ट्स को क्रमबद्ध करने के लिए जावास्क्रिप्टसेरियलाइज़र का उपयोग कर रहा हूं।क्या JavaScriptSerializer गुणों को शून्य/डिफ़ॉल्ट मानों से बाहर कर सकता है?

समस्या यह है कि, सार्वजनिक संपत्तियों में से कई में शून्य या डिफ़ॉल्ट मान होते हैं। क्या JavaScriptSerializer को शून्य या डिफ़ॉल्ट मानों वाले गुणों को बाहर करने का कोई तरीका है?

मैं परिणामस्वरूप जेएसओएन कम वर्बोज़ होना चाहता हूं।

उत्तर

12

समाधान है कि मेरे लिए काम किया:

धारावाहिक वर्ग और गुणों को निम्नानुसार सजाया किया जाएगा:

[DataContract] 
public class MyDataClass 
{ 
    [DataMember(Name = "LabelInJson", IsRequired = false)] 
    public string MyProperty { get; set; } 
} 

IsRequired कुंजी आइटम था।

वास्तविक क्रमबद्धता DataContractJsonSerializer का उपयोग किया जा सकता है:

public static string Serialize<T>(T obj) 
{ 
    string returnVal = ""; 
    try 
    { 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     serializer.WriteObject(ms, obj); 
     returnVal = Encoding.Default.GetString(ms.ToArray()); 
    } 
    } 
    catch (Exception /*exception*/) 
    { 
    returnVal = ""; 
    //log error 
    } 
    return returnVal; 
} 
+6

डेटाकंट्रैक्टजसनसेरियलाइज़र के लिए आपको डेटामम्बर – FinnNk

4

आप JavaScriptConverter को कार्यान्वित कर सकते हैं और इसे JavaScriptSerializer के उपयोग से पंजीकृत कर सकते हैं।

4

Json.NET में स्वचालित या डिफ़ॉल्ट मानों को स्वचालित रूप से बाहर करने के विकल्प हैं।

+13

ओपी जावास्क्रिप्टसेरियलर के बारे में पूछ रहा था, json.net नहीं। –

+5

@ जस्टिनआर। ऐसा लगता है कि वह जेसन.नेट के लेखक हैं और शायद यही कारण है कि – Steve

27

FYI करें, यदि आप आसान समाधान के साथ जाना चाहते हैं, तो यहाँ है कि मैं क्या JavaScriptSerializer के साथ एक JavaScriptConverter कार्यान्वयन का उपयोग यह पूरा करने के लिए प्रयोग किया जाता है:

private class NullPropertiesConverter : JavaScriptConverter 
    { 
     public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      var jsonExample = new Dictionary<string, object>(); 
      foreach (var prop in obj.GetType().GetProperties()) 
      { 
       //check if decorated with ScriptIgnore attribute 
       bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true); 

       var value = prop.GetValue(obj, BindingFlags.Public, null, null, null); 
       if (value != null && !ignoreProp) 
        jsonExample.Add(prop.Name, value); 
      } 

      return jsonExample; 
     } 

     public override IEnumerable<Type> SupportedTypes 
     { 
      get { return GetType().Assembly.GetTypes(); } 
     } 
    } 

और फिर इसे उपयोग करने के लिए:

var serializer = new JavaScriptSerializer(); 
    serializer.RegisterConverters(new JavaScriptConverter[] { new NullPropertiesConverter() }); 
    return serializer.Serialize(someObjectToSerialize); 
+2

पर झूठी पर EmitDefaultValue सेट करने की आवश्यकता है, यह इंगित करना चाहिए कि यदि आप फ़ील्ड चाहते हैं तो कोड में यह गायब है –

+0

यदि आपको आश्चर्य हुआ कि क्या पिछली टिप्पणी इस बारे में बात कर रही थी: http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c –

+0

आप इसे थोड़ा तेज़ बना सकते हैं पहले अनदेखा जांचें और मूल्य प्राप्त न करें जब तक कि यह गलत न हो। – Brain2000

0

बदलते पैर की अंगुली DataContractSerializer

आप ScriptIgnoreAttribute उपयोग कर सकते हैं बिना

[1] http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute.aspx

+5

स्क्रिप्ट अनगिनत उपयोगी है यदि आप हमेशा किसी संपत्ति को अनदेखा करना चाहते हैं, लेकिन यदि आप न केवल मूल्यों वाले गुणों को अनदेखा करना चाहते हैं, लेकिन यदि उनमें वास्तविक मूल्य है तो उन्हें शामिल करें। – Kate

1

इस कोड को ब्लॉक बातिल और डिफ़ॉल्ट (0) सांख्यिक प्रकार

private class NullPropertiesConverter : JavaScriptConverter 
    { 
     public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      var jsonExample = new Dictionary<string, object>(); 
      foreach (var prop in obj.GetType().GetProperties()) 
      { 
       //this object is nullable 
       var nullableobj = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>); 
       //check if decorated with ScriptIgnore attribute 
       bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true); 

       var value = prop.GetValue(obj, System.Reflection.BindingFlags.Public, null, null, null); 
       int i; 
       //Object is not nullable and value=0 , it is a default value for numeric types 
       if (!(nullableobj == false && value != null && (int.TryParse(value.ToString(), out i) ? i : 1) == 0) && value != null && !ignoreProp) 
        jsonExample.Add(prop.Name, value); 
      } 

      return jsonExample; 
     } 

     public override IEnumerable<Type> SupportedTypes 
     { 
      get { return GetType().Assembly.GetTypes(); } 
     } 
    } 
0

के लाभ के लिए के लिए मान है जो लोग इसे Google पर पाते हैं, ध्यान दें कि न्यूटॉन्सॉफ्ट के साथ क्रमिकरण के दौरान नल को मूल रूप से छोड़ा जा सकता है। जेसन

var json = JsonConvert.SerializeObject(
      objectToSerialize, 
      new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); 
संबंधित मुद्दे