使用 Web API 返回匿名类型
本文关键字:类型 返回 Web API 使用 | 更新日期: 2023-09-27 18:30:57
使用 MVC 时,返回 adhoc Json 很容易。
return Json(new { Message = "Hello"});
我正在寻找新的 Web API 的此功能。
public HttpResponseMessage<object> Test()
{
return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}
这将引发异常,因为DataContractJsonSerializer
无法处理匿名类型。
我用这个基于 Json.Net 的JsonNetFormatter替换了它。如果我使用
public object Test()
{
return new { Message = "Hello" };
}
但是如果我不返回HttpResponseMessage
,我看不到使用 Web API 的意义,我最好坚持使用香草 MVC。如果我尝试使用:
public HttpResponseMessage<object> Test()
{
return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}
它序列化整个HttpResponseMessage
。
任何人都可以指导我找到一个解决方案,我可以在HttpResponseMessage
中返回匿名类型?
这在 Beta 版本中不起作用,但在最新的位(从 http://aspnetwebstack.codeplex.com 构建)中有效,因此它可能是 RC 的方式。你可以做
public HttpResponseMessage Get()
{
return this.Request.CreateResponse(
HttpStatusCode.OK,
new { Message = "Hello", Value = 123 });
}
这个答案可能来得有点晚,但截至今天,WebApi 2
已经出来了,现在做你想做的事更容易了,你只需要做:
public object Message()
{
return new { Message = "hello" };
}
沿着管道,它将根据客户端的首选项(Accept
标头)序列化为xml
或json
。希望这可以帮助任何偶然发现这个问题的人
在 Web API 2 中,您可以使用新的 IHttpActionResult 作为 HttpResponseMessage 的替代品,然后返回一个简单的 Json 对象:(与 MVC 类似)
public IHttpActionResult GetJson()
{
return Json(new { Message = "Hello"});
}
JsonObject 来实现此目的:
dynamic json = new JsonObject();
json.Message = "Hello";
json.Value = 123;
return new HttpResponseMessage<JsonObject>(json);
你可以使用 ExpandoObject。(添加using System.Dynamic;
)
[Route("api/message")]
[HttpGet]
public object Message()
{
dynamic expando = new ExpandoObject();
expando.message = "Hello";
expando.message2 = "World";
return expando;
}
您也可以尝试:
var request = new HttpRequestMessage(HttpMethod.Post, "http://leojh.com");
var requestModel = new {User = "User", Password = "Password"};
request.Content = new ObjectContent(typeof(object), requestModel, new JsonMediaTypeFormatter());
在 Web API 2.1 ASP.NET 中,你可以用更简单的方式做到这一点:
public dynamic Get(int id)
{
return new
{
Id = id,
Name = "X"
};
}
您可以在 https://www.strathweb.com/2014/02/dynamic-action-return-web-api-2-1/上阅读有关此内容的更多信息
public IEnumerable<object> GetList()
{
using (var context = new DBContext())
{
return context.SPersonal.Select(m =>
new
{
FirstName= m.FirstName ,
LastName = m.LastName
}).Take(5).ToList();
}
}
}
如果你使用泛型,你应该能够让它工作,因为它会给你一个匿名类型的"类型"。然后,可以将序列化程序绑定到该序列化程序。
public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code)
{
return new HttpResponseMessage<T>(object, code);
}
如果您的类上没有DataContract
或DataMebmer
属性,它将回退到序列化所有公共属性,这应该完全符合您的要求。
(直到今天晚些时候我才有机会对此进行测试,如果有什么不起作用,请告诉我。
您可以在返回对象中封装动态对象,例如
public class GenericResponse : BaseResponse
{
public dynamic Data { get; set; }
}
然后在 WebAPI 中;执行以下操作:
[Route("api/MethodReturingDynamicData")]
[HttpPost]
public HttpResponseMessage MethodReturingDynamicData(RequestDTO request)
{
HttpResponseMessage response;
try
{
GenericResponse result = new GenericResponse();
dynamic data = new ExpandoObject();
data.Name = "Subodh";
result.Data = data;// OR assign any dynamic data here;//
response = Request.CreateResponse<dynamic>(HttpStatusCode.OK, result);
}
catch (Exception ex)
{
ApplicationLogger.LogCompleteException(ex, "GetAllListMetadataForApp", "Post");
HttpError myCustomError = new HttpError(ex.Message) { { "IsSuccess", false } };
return Request.CreateErrorResponse(HttpStatusCode.OK, myCustomError);
}
return response;
}
在 ASP.NET 核心 Web API 6 中,您可以使用 OK:
[HttpGet]
public async Task<IActionResult> GetSomething()
{
return Ok(new { Message = "Hello World" });
}