source

Azure 함수에서 JSON을 반환하는 방법

manycodes 2023. 2. 22. 22:48
반응형

Azure 함수에서 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에 JSON을 반환하는 것에 익숙해진 것 같습니다.모든 것이 액션인 NET MVC

다음은 Azure 함수가 XML 대신 올바른 형식의 JSON 개체를 반환하는 전체 예입니다.

#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"
}

가장 쉬운 방법은 아마도 하는 것이다

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을 반환한다.

가져가실 수 있습니다.req부터

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

를 사용하여 응답을 작성합니다.

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

또는 다른 과부하 조립품 중 하나라도System.Web.Http.

자세한 것은, learn.microsoft.com 를 참조해 주세요.

이것은, 명시적으로 시리얼화할 필요 없이, 「애플리케이션/json」미디어 타입을 사용하는 것만으로 실현될 수 있을 것 같습니다.Person와 함께Newtonsoft.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; }
    }

JSON은 꽤 쉬워요, 뉴턴소프트.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);
}

메서드 시그니처는 다음과 같이 변경할 수 있습니다.

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

그러면 JSON 데이터가 반환됩니다.

저도 비슷한 문제가 있었는데 이게 제일 인기 있는 댓글인 것 같아요.어떤 노드를 사용하는지 파악한 후 아래가 작동하여 원하는 노드를 정확하게 제공합니다.다른 예에서는 JSON을 반환하는 문자열 표현을 반환합니다.

시스템을 사용하여 선언하는 것을 잊지 마십시오.텍스트 및 추가:

return JsonConvert.SerializeObject(person);

Juunas 응답에 따라 GetJson 기능을 수행합니다.

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

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static IActionResult Run(HttpRequest req, ILogger log)
{    
    (string name, string surname) = ("James", "Ozzy");
    return new ObjectResult(new { name, surname }) ;
 }

소유자 응답을 작성할 수 있습니다.

 var response = new HttpResponseMessage(HttpStatusCode.OK) { 
                Content = json
            };
 return new ObjectResult(response);

둘 다 사용하지 않는 경우Newtonsoft.Json또는System.Web.Http(이 답변과 같이)

var msg = new Msg("Hello, World");

var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteAsJsonAsync(msg);
return response;

언급URL : https://stackoverflow.com/questions/38943858/how-do-i-return-json-from-an-azure-function

반응형