从没有属性的 web api 返回 JsonResult

Posted

技术标签:

【中文标题】从没有属性的 web api 返回 JsonResult【英文标题】:Return JsonResult from web api without its properties 【发布时间】:2014-10-14 00:10:42 【问题描述】:

我有一个 Web API 控制器,从那里我从一个动作返回一个对象作为 JSON。

我是这样做的:

public ActionResult GetAllNotificationSettings()

    var result = new List<ListItems>();
    // Filling the list with data here...

    // Then I return the list
    return new JsonResult  Data = result ;

但是通过这种方式,包括其Data 属性的 JsonResult 对象被序列化为 JSON。所以我最终由操作返回的 JSON 如下所示:


    "ContentEncoding": null,
    "ContentType": null,
    "Data": 
        "ListItems": [
            
                "ListId": 2,
                "Name": "John Doe"
            ,
            
                "ListId": 3,
                "Name": "Jane Doe"
            ,
        ]
    ,
    "JsonRequestBehavior": 1,
    "MaxJsonLength": null,
    "RecursionLimit": null

我无法序列化这个 JSON 字符串,因为 JsonResult 对象向它添加了各种其他属性。我只对ListItems 感兴趣,没有别的。但它会自动添加如下内容:ContentTypeMaxJsonLength 等...

现在这对我不起作用,因为 JSON 字符串中的所有其他属性...

var myList = JsonConvert.DeserializeObject<List<ListItems>>(jsonString);

有没有办法从操作中发送一个 JSON 对象,这样它就不会添加我不需要的所有属性?

【问题讨论】:

这看起来不像 web api 而是普通的 mvc。 @DanielA.White 嗯,它是 Web API。我的控制器也从它扩展而来。 你不应该使用ActionResult/JsonResult 啊,我明白了,那可以解释问题了:p 要在“常规控制器”中返回 json 数据,您的方法必须返回 new Json,请参阅:***.com/a/227638/19046 【参考方案1】:
return JsonConvert.SerializeObject(images.ToList(), Formatting.None, new JsonSerializerSettings  PreserveReferencesHandling = PreserveReferencesHandling.None, ReferenceLoopHandling = ReferenceLoopHandling.Ignore );


using Newtonsoft.Json;

【讨论】:

【参考方案2】:

我遇到了类似的问题(不同之处在于我想返回一个已经转换为 json 字符串的对象,而我的控制器 get 返回一个 IHttpActionResult

这是我解决它的方法。首先我声明了一个实用程序类

public class RawJsonActionResult : IHttpActionResult

    private readonly string _jsonString;

    public RawJsonActionResult(string jsonString)
    
        _jsonString = jsonString;
    

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    
        var content = new StringContent(_jsonString);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = new HttpResponseMessage(HttpStatusCode.OK)  Content = content ;
        return Task.FromResult(response);
    

然后可以在您的控制器中使用此类。这是一个简单的例子

public IHttpActionResult Get()

    var jsonString = "\"id\":1,\"name\":\"a small object\" ";
    return new RawJsonActionResult(jsonString);

【讨论】:

【参考方案3】:

作为一个使用 ASP.NET API 大约 3 年的人,我建议改为返回 HttpResponseMessage。不要使用 ActionResult 或 IEnumerable!

ActionResult 不好,因为正如您所发现的那样。

返回 IEnumerable 不好,因为您可能希望稍后扩展它并添加一些标头等。

使用 JsonResult 不好,因为您应该允许您的服务可扩展并支持其他响应格式,以防万一;如果你真的想限制它,你可以使用动作属性来做到这一点,而不是在动作正文中。

public HttpResponseMessage GetAllNotificationSettings()

    var result = new List<ListItems>();
    // Filling the list with data here...

    // Then I return the list
    return Request.CreateResponse(HttpStatusCode.OK, result);

在我的测试中,我通常使用下面的辅助方法从 HttpResponseMessage 中提取我的对象:

 public class ResponseResultExtractor
    
        public T Extract<T>(HttpResponseMessage response)
        
            return response.Content.ReadAsAsync<T>().Result;
        
    

var actual = ResponseResultExtractor.Extract<List<ListItems>>(response);

通过这种方式,您实现了以下目标:

您的操作还可以返回错误消息和状态代码,如 404 未找到,因此您可以通过上述方式轻松处理它。 您的操作不仅限于 JSON,还支持 JSON,具体取决于客户端的请求首选项和 Formatter 中的设置。

看这个:http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation

【讨论】:

不错的答案,但我想使用 webapi2,我们现在应该使用 IHttpActionResult:***.com/questions/21758615/…【参考方案4】:

使用 WebAPI 时,您应该只返回 Object 而不是专门返回 Json,因为 API 将根据请求返回 JSON 或 XML。

我不确定您的 WebAPI 为何返回 ActionResult,但我会将代码更改为类似;

public IEnumerable<ListItems> GetAllNotificationSettings()

    var result = new List<ListItems>();
    // Filling the list with data here...

    // Then I return the list
    return result;

如果您从某些 AJAX 代码调用它,这将产生 JSON。

附言 WebAPI 应该是 RESTful 的,所以你的 Controller 应该叫做 ListItemController 而你的 Method 应该叫做 Get。但那是另一天。

【讨论】:

+1 但是关于你的最后一点,REST 与控制器或方法的名称无关。 @demoncodemonkey 不是真的,但从问题中进行的命名约定,我可以猜到它们在同一个控制器中有许多 Get 的负载,它们返回不同的对象。 Cleaner (IMO) 保持 HttpGet 的命名为 Get 同意,但与 REST 无关 :)

以上是关于从没有属性的 web api 返回 JsonResult的主要内容,如果未能解决你的问题,请参考以下文章

管理从 web api 以 json 格式返回的属性名称

添加 Authorize 属性时 Web api 核心返回 404

Spring JPA:从没有where子句的表中查询一列

从没有参数的函数返回整数数组[重复]

一个从没见过的C# ?.语法

如果成功,从没有结果的函数返回错误的惯用方法是啥?