it-swarm.com.ru

Как вернуть JSON из функции Azure

Я играю с Функции Azure . Тем не менее, я чувствую, что я поставлен в тупик на что-то довольно простое. Я пытаюсь выяснить, как вернуть некоторые основные 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; }
}

Тем не менее, я полностью застрял в процессе сериализации и возврата. Думаю, я привык возвращать JSON в ASP.NET MVC, где все является действием

19
xam developer

Вот полный пример функции Azure, возвращающей правильно отформатированный объект JSON вместо XML:

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

11
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

Похоже, что этого можно достичь, просто используя тип носителя «application/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; }
    }
5
Dima Gershman

Вы можете изменить подпись метода на:

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

и это позволит возвращать данные JSON.

2
Burak Tasci

У меня была похожая проблема, и, похоже, это был самый популярный пост без ответа. После определения того, какой узел работает, должно работать приведенное ниже и дать вам именно то, что вам нужно. Другие примеры все еще возвращают строковое представление, где это возвратит JSON. 

Не забудьте объявить, используя System.Text; а также добавить:

return JsonConvert.SerializeObject(person);

к функции GetJson согласно ответу Juunas.

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

0
Matt