【问题标题】:Asp.Net Controller action returning unexpected JSON dataAsp.Net 控制器操作返回意外的 JSON 数据
【发布时间】:2019-04-18 16:06:59
【问题描述】:

我正在研究一些旧代码,但我看到了一些我无法弄清楚的东西。代码是一个返回动态对象的控制器动作:

return new
{
    Result = true,
    Count = data.Count(),
    Students = data.Select(s => string.Format("{0}, {1}", s.LastName, s.FirstName))
};

但是,浏览器中生成的 JSON 并没有像我预期的那样返回:

{
    "$id":"1",
    "Result":true,
    "Count":1,
    "Students":
    {
        "$id":"2",
        "$values":["USER, ACTIVE"]
    }
}

我所期望的,以及我在做这种事情时通常会得到的,更像是这样的:

{
    "Result":true,
    "Count":1,
    "Students":
    {
        ["USER, ACTIVE"]
    }
}

我不知道 $id 和 $values 属性的来源。我以前从未见过.Net 发生过这种情况,所以我不确定是什么原因造成的。导致问题的不是动态对象返回,因为我将它切换为命名类型只是为了测试它,它仍然做同样的事情。

【问题讨论】:

标签: asp.net json asp.net-mvc


【解决方案1】:

您需要将这行代码添加到Global.asax 以避免附加$id

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling 
= Newtonsoft.Json.PreserveReferencesHandling.None;

【讨论】:

  • 好的,如果我也将操作方法​​更改为返回 IHttpActionResult 而不是动态的,并且将上面的代码更改为 return Json(<object) 而不是只是 return <object>,则可以。关于如何在不进行更改的情况下使其工作的任何想法?
  • 您返回的是模型还是对象?如果您返回不需要配置的 DTO 或模型对象
  • 代码返回的正是我上面显示的内容。为了使这个配置工作,我不得不将它包装在 Json() 方法中。
【解决方案2】:

你需要在学生的末尾有一个 .ToList()。

{
    Result = true,
    Count = data.Count(),
    Students = data.Select(s => string.Format("{0}, {1}", s.LastName, s.FirstName)).ToList()
};

【讨论】:

  • 这将如何删除$id 属性?无论如何,添加ToList 在这里实际上是零效果。
猜你喜欢
  • 2011-08-16
  • 2020-05-27
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多