it-swarm.com.de

Wie gebe ich JSON von einer Azure-Funktion zurück?

Ich spiele mit Azure Functions . Ich habe jedoch das Gefühl, dass ich auf etwas ziemlich Einfaches stumm bin. Ich versuche herauszufinden, wie man einige grundlegende JSON zurückgibt. Ich bin mir nicht sicher, wie man JSON erstellt und auf meine Anfrage zurückbringt. 

Ich habe einmal ein Objekt erstellt, seine Eigenschaften aufgefüllt und es serialisiert. Also habe ich diesen Weg eingeschlagen:

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

Allerdings bin ich jetzt total auf den Serialisierungs- und Rückkehrprozess gestoßen. Ich denke, ich bin es gewohnt, JSON in ASP.NET MVC zurückzugeben, in dem alles eine Aktion ist

19
xam developer

Hier ist ein vollständiges Beispiel einer Azure-Funktion, die ein ordnungsgemäß formatiertes JSON-Objekt anstelle von XML zurückgibt:

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

Navigieren Sie in einem Browser zum Endpunkt, und Sie sehen:

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

Sie können req von nehmen

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

und erstellen Sie die Antwort mit

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

oder eine der anderen Überladungen in Assembly System.Web.Http.

Weitere Informationen zu docs.Microsoft.com

11
hansmbakker

JSON ist ziemlich einfach, die Newtonsoft.Json-Bibliothek ist ein Spezialfall . Sie können es einschließen, indem Sie dies oben in der Skriptdatei hinzufügen:

#r "Newtonsoft.Json"

using Newtonsoft.Json;

Dann wird Ihre Funktion:

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

Es sieht so aus, als könnte dies nur durch die Verwendung des Medientyps "application/json" erreicht werden, ohne dass Person mit Newtonsoft.Json explizit serialisiert werden muss.

Hier ist das vollständige Funktionsbeispiel, das in Chrome als resultiert:

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

Der Code ist wie folgt angegeben:

[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

Der einfachste Weg ist vielleicht zu

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

Setzt den Inhaltstyp auf application/json und geben Sie den json im Antworttext zurück.

4
Bjorn Reppen

Sie können die Methodensignatur ändern in:

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

jSON-Daten können zurückgegeben werden.

2
Burak Tasci

Ich hatte ein ähnliches Thema und dies schien der beliebteste Beitrag ohne Antwort zu sein. Nachdem Sie herausgefunden haben, welcher Knoten funktioniert, sollte der unten stehende funktionieren und Ihnen genau das geben, wonach Sie suchen. Die anderen Beispiele geben immer noch eine Zeichenfolgendarstellung zurück, die JSON zurückgibt. 

Denken Sie daran, mit System.Text zu deklarieren. und füge hinzu:

return JsonConvert.SerializeObject(person);

auf die GetJson-Funktion gemäß Juunas-Antwort.

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

0
Matt