JavaScriptSerializer 可以排除具有 null默认值的属性吗

jsJava

1个回答

写回答

17260222828

2025-07-05 22:30

+ 关注

Java
Java

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

JavaScriptSerializer是.NET Framework提供的一个类,用于将对象序列化为JSON格式的字符串,或将JSON格式的字符串反序列化为对象。它是一个非常方便的工具,可以在.NET应用程序中处理JSON数据。

在使用JavaScriptSerializer进行对象序列化时,有时候我们希望排除掉那些具有null值或默认值的属性,以减少序列化后的JSON字符串的大小,提高传输效率。但是,JavaScriptSerializer本身并没有提供直接的方法来实现这个功能。不过,我们可以通过自定义一个转换器来实现这个需求。

自定义转换器

在.NET Framework中,可以通过实现IContractResolver接口来自定义如何序列化和反序列化对象。我们可以创建一个继承自DefaultContractResolver的自定义解析器,并重写其CreateProperties方法,来控制哪些属性需要被序列化。

下面是一个示例代码,演示了如何使用自定义转换器来排除具有null/默认值的属性:

csharp

public class CustomContractResolver : DefaultContractResolver

{

protected override IList<JSonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)

{

var properties = base.CreateProperties(type, memberSerialization);

// 排除具有null/默认值的属性

properties = properties.Where(p => !IsNullOrDefaultValue(p.ValueProvider.GetValue(p.Name))).ToList();

return properties;

}

private bool IsNullOrDefaultValue(object value)

{

if (value == null)

{

return true;

}

if (value.GetType().IsValueType)

{

return value.Equals(Activator.CreateInstance(value.GetType()));

}

return false;

}

}

public class ExampleObject

{

public string Prop1 { get; set; }

public int Prop2 { get; set; }

public bool Prop3 { get; set; }

}

public static void MAIn()

{

var obj = new ExampleObject

{

Prop1 = null,

Prop2 = 0,

Prop3 = false

};

var serializer = new JavaScriptSerializer();

serializer.RegisterConverters(new[] { new JavaScriptConverter() });

var JSon = serializer.Serialize(obj);

Console.WriteLine(JSon);

}

在上面的示例中,我们首先定义了一个CustomContractResolver类,继承自DefaultContractResolver。然后,重写了CreateProperties方法,在这个方法中,我们使用了LINQ语句来排除那些具有null/默认值的属性。

接下来,我们定义了一个ExampleObject类作为示例,其中包含了三个属性:Prop1、Prop2和Prop3。在MAIn方法中,我们创建了一个ExampleObject对象,并将其序列化为JSON字符串。序列化过程中,我们将自定义的解析器注册到JavaScriptSerializer中,以实现属性排除的功能。

运行上面的代码,输出的JSON字符串将不包含具有null/默认值的属性。这样,我们就成功地使用JavaScriptSerializer排除了具有null/默认值的属性。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号