web-dev-qa-db-ja.com

Azure FunctionからJSONを返す方法

Azure Functions で遊んでいます。しかし、私は非常に単純なものに困惑しているように感じます。基本的なJSONを返す方法を見つけようとしています。 JSONを作成してリクエストに戻す方法がわかりません。

むかしむかし、オブジェクトを作成し、そのプロパティを設定して、シリアル化します。だから、私はこの道を始めました:

#r "Newtonsoft.Json"

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info($"Running Function");    
    try {      
      log.Info($"Function ran");

      var myJSON = GetJson();

      // I want myJSON to look like:
      // {
      //   firstName:'John',
      //   lastName: 'Doe',
      //   orders: [
      //     { id:1, description:'...' },
      //     ...
      //   ]
      // }
      return ?;
    } catch (Exception ex) {
        // TODO: Return/log exception
        return null;
    }
}

public static ? GetJson() 
{
  var person = new Person();
  person.FirstName = "John";
  person.LastName = "Doe";

  person.Orders = new List<Order>();
  person.Orders.Add(new Order() { Id=1, Description="..." });

  ?
}

public class Person 
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public List<Order> Orders { get; set; }
}

public class Order
{
  public int Id { get; set; }
  public string Description { get; set; }
}

しかし、私は完全にシリアル化と返品プロセスにこだわっています。私はすべてがアクションであるASP.NET MVCでJSONを返すことに慣れていると思います

28
xam developer

XMLの代わりに適切にフォーマットされたJSONオブジェクトを返すAzure関数の完全な例を次に示します。

#r "Newtonsoft.Json"
using System.Net;
using Newtonsoft.Json;
using System.Text;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    var myObj = new {name = "thomas", location = "Denver"};
    var jsonToReturn = JsonConvert.SerializeObject(myObj);

    return new HttpResponseMessage(HttpStatusCode.OK) {
        Content = new StringContent(jsonToReturn, Encoding.UTF8, "application/json")
    };
}

ブラウザでエンドポイントに移動すると、以下が表示されます。

{
  "name": "thomas",
  "location": "Denver"
}
28
Levi Fuller

からreqを取得できます

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)

を使用して応答を作成します

return req.CreateResponse(HttpStatusCode.OK, json, "application/json");

またはアセンブリ内の他のオーバーロードSystem.Web.Http

docs.Microsoft.com の詳細

14
hansmbakker

JSONは非常に簡単で、Newtonsoft.Jsonライブラリは 特殊なケース です。これをスクリプトファイルの先頭に追加して含めることができます。

#r "Newtonsoft.Json"

using Newtonsoft.Json;

次に、関数は次のようになります。

public static string GetJson() 
{
  var person = new Person();
  person.FirstName = "John";
  person.LastName = "Doe";

  person.Orders = new List<Order>();
  person.Orders.Add(new Order() { Id=1, Description="..." });

  return JsonConvert.SerializeObject(person);
}
5
juunas

PersonNewtonsoft.Jsonで明示的にシリアル化する必要なく、「application/json」メディアタイプを使用するだけでこれを実現できるようです。

以下は、Chrome=

{"FirstName":"John","LastName":"Doe","Orders":[{"Id":1,"Description":"..."}]}

コードは次のとおりです。

[FunctionName("StackOverflowReturnJson")]
    public static HttpResponseMessage Run([HttpTrigger("get", "post", Route = "StackOverflowReturnJson")]HttpRequestMessage req, TraceWriter log)
    {
        log.Info($"Running Function");
        try
        {
            log.Info($"Function ran");

            var myJSON = GetJson();  // Note: this actually returns an instance of 'Person' 

            // I want myJSON to look like:
            // {
            //   firstName:'John',
            //   lastName: 'Doe',
            //   orders: [
            //     { id:1, description:'...' },
            //     ...
            //   ]
            // }
            var response = req.CreateResponse(HttpStatusCode.OK, myJSON, JsonMediaTypeFormatter.DefaultMediaType); // DefaultMediaType = "application/json" does the 'trick'
            return response;
        }
        catch (Exception ex)
        {
            // TODO: Return/log exception
            return null;
        }
    }

    public static Person GetJson()
    {
        var person = new Person();
        person.FirstName = "John";
        person.LastName = "Doe";

        person.Orders = new List<Order>();
        person.Orders.Add(new Order() { Id = 1, Description = "..." });

        return person;
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }
5
Dima Gershman

おそらく最も簡単な方法は

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "/jsontestapi")] HttpRequest req,
    ILogger log)
{
    return new JsonResult(resultObject);
}

Content-typeをapplication/jsonに設定し、応答本文でjsonを返します。

4
Bjorn Reppen

メソッドのシグネチャを次のように変更できます。

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)

jSONデータを返すことができます。

2
Burak Tasci

私は同様の問題を抱えており、これは答えのない最も人気のある投稿のようでした。どのノードが機能するかを考えた後、以下が機能し、正確に何を求めているのかがわかります。他の例は、JSONを返す文字列表現を返します。

System.Textを使用して宣言することを忘れないでください。以下も追加します。

return JsonConvert.SerializeObject(person);

juunasレスポンスごとのGetJson関数へ。

    return new HttpResponseMessage(HttpStatusCode.OK)
       {
           Content = new StringContent(GetJson(), Encoding.UTF8, "application/json")
       };
1
Matt