简体   繁体   English

JavaScriptSerializer 可以排除具有空值/默认值的属性吗?

[英]Can JavaScriptSerializer exclude properties with null/default values?

I'm using JavaScriptSerializer to serialize some entity objects.我正在使用 JavaScriptSerializer 序列化一些实体对象。

The problem is, many of the public properties contain null or default values.问题是,许多公共属性包含空值或默认值。 Is there any way to make JavaScriptSerializer exclude properties with null or default values?有没有办法让 JavaScriptSerializer 排除具有空值或默认值的属性?

I would like the resulting JSON to be less verbose.我希望生成的 JSON 不那么冗长。

FYI, if you'd like to go with the easier solution, here's what I used to accomplish this using a JavaScriptConverter implementation with the JavaScriptSerializer:仅供参考,如果您想使用更简单的解决方案,这里是我使用带有 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();
  }
 }
}

and then to use it:然后使用它:

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

The solution that worked for me:对我有用的解决方案:

The serialized class and properties would be decorated as follows:序列化的类和属性将装饰如下:

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

IsRequired was the key item. IsRequired 是关键项。

The actual serialization could be done using DataContractJsonSerializer:实际的序列化可以使用 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;
}

For the benefit of those who find this on google, note that nulls can be skipped natively during serialization with Newtonsoft.Json为了那些在谷歌上找到这个的人的利益,请注意,在使用 Newtonsoft.Json 进行序列化期间可以本机跳过空值

var json = JsonConvert.SerializeObject(
            objectToSerialize,
            new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore});

You can implement a JavaScriptConverter and register it using the RegisterConverters method of JavaScriptSerializer .您可以实现JavaScriptConverter并使用JavaScriptSerializerRegisterConverters方法注册它。

Json.NET has options to automatically exclude null or default values. Json.NET具有自动排除空值或默认值的选项。

This code is block null and default(0) values for numeric types此代码是数字类型的 block null 和 default(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();
  }
 }
}

Without changing toe DataContractSerializer不改变脚趾 DataContractSerializer

You can use ScriptIgnoreAttribute您可以使用 ScriptIgnoreAttribute

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM