8

我有一个为特定类的对象返回 JsonResult 的操作。我用一些属性修饰了这个类的属性以避免空字段。类定义是:

    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; }
    }

在我的行动中,我使用了一个对象

    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}]

我错过了什么或做错了什么?

4

3 回答 3

8

正如 Brad Christie 所说,MVC4 仍然使用 JavaScriptSerializer,因此为了让您的对象被 Json.Net 序列化,您必须执行几个步骤。

首先,从 JsonResult 继承一个新的类 JsonNetResult 如下(基于 此解决方案):

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);
}
于 2012-11-09T09:35:45.307 回答
1

Controller.Json使用JavaScriptSerializer不是Newtonsoft Json 库(这是它的JsonPropertyAttribute来源)。

您要么需要使用 Newtonsoft 库并以这种方式返回序列化结果,要么继续调用Json并编写一个将忽略空值的转换器。

于 2012-11-08T20:09:37.897 回答
0

我的建议是看看如果你只是将一个 GanttEvent 对象序列化为 JSON 会发生什么。还要检查您对 Json 的调用是否合适。

于 2012-11-08T20:07:46.197 回答