我有一个动作,它返回特定类对象的JsonResult。我已经使用一些attrib来装饰这个类的属性以避免使用null字段。类定义是:
private class GanttEvent
{
public String name { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public String desc { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public List<GanttValue> values { get; set; }
}
在我的Action中我使用了一个对象
var res = new List<GanttEvent>();
我将使用:
return Json(res, JsonRequestBehavior.AllowGet);
不幸的是,我仍然在输出端收到空值:
[{"name":"1.1 PREVIOS AL INICIO ","desc":null,"values":null},{"name":"F04-PGA-S10","desc":"Acta preconstrucción","values":null},{"name":"F37-PGA-S10","desc":"Plan de inversión del anticipo","values":null},{"name":"F09-PGA-S10","desc":"Acta de vecindad","values":null},{"name":"F05-PGA-S10","desc":"Acta de inicio","values":null},{"name":"F01-PGA-S10","desc":"Desembolso de anticipo","values":null}]
我错过了什么或做错了什么?
答案 0 :(得分:8)
正如Brad Christie所说,MVC4仍然使用JavaScriptSerializer,因此为了让你的对象被Json.Net序列化,你将不得不执行几个步骤。
首先,从JsonResult继承一个新类JsonNetResult,如下所示(基于this solution):
public class JsonNetResult : JsonResult
{
public JsonNetResult()
{
this.ContentType = "application/json";
}
public JsonNetResult(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior jsonRequestBehavior)
{
this.ContentEncoding = contentEncoding;
this.ContentType = !string.IsNullOrWhiteSpace(contentType) ? contentType : "application/json";
this.Data = data;
this.JsonRequestBehavior = jsonRequestBehavior;
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
var response = context.HttpContext.Response;
response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
if (Data == null)
return;
// If you need special handling, you can call another form of SerializeObject below
var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None);
response.Write(serializedObject);
}
}
然后,在您的控制器中,覆盖Json方法以使用新类:
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult(data, contentType, contentEncoding, behavior);
}
答案 1 :(得分:2)
Controller.Json
使用JavaScriptSerializer
而不是Newtonsoft Json library(JsonPropertyAttribute
来自的地方)。
您需要使用Newtonsoft库库并以这种方式返回序列化结果,或者继续调用Json
并编写一个忽略空值的converter。
答案 2 :(得分:0)
我的建议是看看如果你只是将一个GanttEvent对象序列化为JSON会发生什么。还要检查你对Json的电话是否合适。