visual studio microsoft management functions deploy create c# json azure azure-functions

c# - microsoft - install azure functions visual studio 2017



¿Cómo devuelvo JSON desde una función de Azure? (6)

Estoy jugando con Azure Functions . Sin embargo, siento que estoy confundido con algo bastante simple. Estoy tratando de averiguar cómo devolver algunos JSON básicos. No estoy seguro de cómo crear algunos JSON y devolverlos a mi solicitud.

Una vez, crearía un objeto, poblaría sus propiedades y lo serializaría. Entonces, comencé por este camino:

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

Sin embargo, ahora estoy totalmente atascado en el proceso de serialización y devolución. Supongo que estoy acostumbrado a devolver JSON en ASP.NET MVC, donde todo es una Acción.


Aquí hay un ejemplo completo de una función de Azure que devuelve un objeto JSON correctamente formateado en lugar de 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") }; }

Navegue hasta el punto final en un navegador y verá:

{ "name": "thomas", "location": "Denver" }


JSON es bastante fácil, la biblioteca Newtonsoft.Json es un caso especial . Puede incluirlo agregando esto en la parte superior del archivo de script:

#r "Newtonsoft.Json" using Newtonsoft.Json;

Entonces tu función se convierte en:

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); }


Parece que esto se puede lograr simplemente usando el tipo de medio "application / json", sin la necesidad de serializar explícitamente Person with Newtonsoft.Json .

Aquí está la muestra de trabajo completa que resulta en Chrome como:

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

El código se da a continuación:

[FunctionName("ReturnJson")] public static HttpResponseMessage Run([HttpTrigger("get", "post", Route = "ReturnJson")]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; } }


Puede cambiar la firma del método en:

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

y permitirá que se devuelvan datos JSON.


Puedes tomar los req de

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

y crea la respuesta usando

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

o cualquiera de las otras sobrecargas en el ensamblaje System.Web.Http .

Más información en docs.microsoft.com


Tuve un problema similar y este parecía ser el post más popular sin respuesta. Después de determinar qué nodo hace lo siguiente, debería funcionar y proporcionarle exactamente lo que está buscando. Los otros ejemplos siguen devolviendo una representación de cadena cuando esto devolverá JSON.

Recuerde declarar usando System.Text; y también agregar:

return JsonConvert.SerializeObject(person);

A la función GetJson según la respuesta de Juunas.

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