79

使用 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 的意义,我最好还是坚持使用 vanilla MVC。如果我尝试使用:

public HttpResponseMessage<object> Test()
{
   return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK);
}

它序列化整个HttpResponseMessage.

任何人都可以指导我找到一个可以在其中返回匿名类型的解决方案HttpResponseMessage吗?

4

10 回答 10

87

这在 Beta 版本中不起作用,但在最新版本(从http://aspnetwebstack.codeplex.com构建)中起作用,因此它可能是 RC 的方式。你可以做

public HttpResponseMessage Get()
{
    return this.Request.CreateResponse(
        HttpStatusCode.OK,
        new { Message = "Hello", Value = 123 });
}
于 2012-04-12T14:31:19.157 回答
20

这个答案可能来得有点晚,但截至今天WebApi 2已经出来了,现在做你想做的事情更容易,你只需要做:

public object Message()
{
    return new { Message = "hello" };
}

并且沿着管道,它将被序列化为xmljson根据客户的偏好(Accept标题)。希望这可以帮助任何偶然发现这个问题的人

于 2016-06-03T20:00:21.607 回答
11

在 web API 2 中,您可以使用新的 IHttpActionResult 替代 HttpResponseMessage,然后返回一个简单的 Json 对象:(类似于 MVC)

public IHttpActionResult GetJson()
    {
       return Json(new { Message = "Hello"});
    }
于 2018-10-26T05:38:22.267 回答
7

您可以为此使用 JsonObject:

dynamic json = new JsonObject();
json.Message = "Hello";
json.Value = 123;

return new HttpResponseMessage<JsonObject>(json);
于 2012-05-22T10:53:42.850 回答
5

您可以使用ExpandoObject(添加using System.Dynamic;

[Route("api/message")]
[HttpGet]
public object Message()
{
    dynamic expando = new ExpandoObject();
    expando.message = "Hello";
    expando.message2 = "World";
    return expando;
}
于 2015-02-06T17:38:52.323 回答
3

您也可以尝试:

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());
于 2013-07-17T15:47:05.090 回答
3

在 ASP.NET Web API 2.1 中,您可以以更简单的方式进行操作:

public dynamic Get(int id) 
{
     return new 
     { 
         Id = id,
         Name = "X"
     };
}

您可以在https://www.strathweb.com/2014/02/dynamic-action-return-web-api-2-1/上阅读更多相关信息

于 2018-03-12T15:17:19.093 回答
2

如果你使用泛型,你应该能够让它工作,因为它会给你一个匿名类型的“类型”。然后,您可以将序列化程序绑定到它。

public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code)
{
    return new HttpResponseMessage<T>(object, code);
}

如果您的类上没有DataContractDataMebmer属性,它将依赖于序列化所有公共属性,这应该完全符合您的要求。

(直到今天晚些时候我才有机会对此进行测试,如果出现问题,请告诉我。)

于 2012-04-12T13:50:48.837 回答
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();               
        }
    }
}
于 2020-06-04T04:54:33.397 回答
0

您可以将动态对象封装在返回对象中,例如

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;
}
于 2016-04-04T10:36:35.267 回答