79

MVC を使用すると、アドホック 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" };
 }

しかし、返さない場合はWeb APIを使用する意味がわかりませんHttpResponseMessage。バニラMVCに固執する方がよいでしょう。私が試してみると:

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

全体をシリアライズしますHttpResponseMessage

内で匿名型を返すことができるソリューションを教えてくれる人はいHttpResponseMessageますか?

4

10 に答える 10

87

これはベータリリースでは機能しませんが、最新のビット(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" };
}

パイプラインに沿って、クライアントの設定 (ヘッダー)に合わせて、xmlまたはそれに従ってシリアル化されます。これが、この質問に出くわした人に役立つことを願っていますjsonAccept

于 2016-06-03T20:00:21.607 に答える
7

これにはJsonObjectを使用できます。

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

return new HttpResponseMessage<JsonObject>(json);
于 2012-05-22T10:53:42.850 に答える
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 に答える
2

ジェネリックを使用すると、匿名型の「型」が得られるため、これを機能させることができるはずです。その後、シリアライザーをそれにバインドできます。

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

DataContractクラスにまたは属性がない場合はDataMebmer、すべてのパブリック プロパティをシリアル化することにフォールバックします。

(今日遅くまでこれをテストする機会がありません。うまくいかない場合はお知らせください。)

于 2012-04-12T13:50:48.837 に答える
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 に答える