1、前言
在写项目的过程中,遇到了接口返回Json数据忽略实体类空值属性的问题,有的时候我们在往前台返回数据的时候实体类中的有些属性是用不到的,我们在写sql语句的时候就不会查询这些字段的值,那么对应实体类中这些没有值的属性就会使用默认值null,null不是我们所需要的,就需要过滤掉空值。 如下图:
2、解决办法
① 使用Newtonsoft.Json来进行空值处理
public string GetStudents()
{
// 方法一:返回出去的是字符串类型
JsonSerializerSettings setting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
string studentInfo = JsonConvert.SerializeObject(StudentBLL.GetStudents(), Formatting.Indented, setting);
return studentInfo;
}
② 重写Json()方法
// 方法二:重写JsonResult类中的Json方法,在方法中进行空值处理
protected override JsonResult Json(object data, string contentType, Encoding encoding, JsonRequestBehavior behavior)
{
return new JsonNetResult(data);
}
JsonNetResult工具类
using System.Web.Mvc;
using Newtonsoft.Json;
namespace Test.Utility
{
public class JsonNetResult : JsonResult
{
public JsonNetResult(object data)
{
Data = data;
}
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.ContentType = "application/json";
var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None);
response.Write(serializedObject);
}
}
}
说明:
var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None);
如果Formatting.None说明在序列化数据的时没有设置忽略空值,这时候我们需要手动在实体类属性上面加上忽略空值的设置,如下代码:
using PetaPoco;
using Newtonsoft.Json;
namespace Test.Model
{
[TableName("students")]
public class Student
{
[Column("s_id")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? Id { get; set; }
[Column("name")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
[Column("age")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int? Age { get; set; }
[Column("telephone")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Telephone { get; set; }
[Column("gender")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Gender { get; set; }
[Column("email")]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Email { get; set; }
}
}
3、处理空值之后运行结果图
① 第一种方法
② 第二种方法