我有一个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
感兴趣,没有别的。但它会自动添加以下内容:ContentType
,MaxJsonLength
等...
由于JSON字符串中的所有其他属性,现在这对我不起作用...
var myList = JsonConvert.DeserializeObject<List<ListItems>>(jsonString);
有没有办法从动作中发送JSON对象,以便它不会添加我不需要的所有属性?
答案 0 :(得分:46)
作为使用ASP.NET API约3年的人,我建议改为返回HttpResponseMessage。不要使用ActionResult或IEnumerable!
ActionResult很糟糕,因为你已经发现了。
返回IEnumerable&lt;&gt;很糟糕,因为您可能希望稍后扩展它并添加一些标题等。
使用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);
通过这种方式,您实现了以下目标:
看看这个:http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation
答案 1 :(得分:12)
使用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。
<强> P.S 强>
WebAPI应该是RESTful的,因此您的Controller应该被称为ListItemController
,而您的方法应该只被称为Get
。但那是另一天。
答案 2 :(得分:9)
我有一个类似的问题(差异是我想要返回一个已经转换为json字符串的对象而我的控制器返回 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 :(得分:-2)
data