【问题标题】:How do I return JSON from an Azure Function如何从 Azure 函数返回 JSON
【发布时间】:2016-08-14 15:46:11
【问题描述】:

我在玩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,其中一切都是一个动作

【问题讨论】:

  • 您有一些答案 - 请标记一个作为您问题的答案。我根据最近的文档提供了最新的答案。

标签: c# json azure azure-functions


【解决方案1】:

这是一个 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"
}

【讨论】:

【解决方案2】:

最简单的方法可能是

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。

【讨论】:

  • 我使用了这个并将一些设置传递给JsonResult(例如:new JsonSerializerSettings())但随后它抛出错误说'JsonResult.SerializerSettings' must be an instance of type 'Newtonsoft.Json.JsonSerializerSettings'..这是什么......知道如何通过这些设置?
【解决方案3】:

你可以把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

【讨论】:

  • 我更喜欢使用:req.CreateResponse(HttpStatusCode.OK, json, JsonMediaTypeFormatter.DefaultMediaType);。我认为它比application/json 字符串更安全。
  • 不错,有没有办法把它转成XML?
  • 这并没有解决我的问题。我认为这是因为 json 不是在我的函数中生成的,而是来自 http 调用。 Levi Fuller 的回答确实解决了我的问题。
【解决方案4】:

看起来这可以通过使用“application/json”媒体类型来实现,而不需要用Newtonsoft.Json显式序列化Person

这是导致 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; }
    }

【讨论】:

  • 不错,有没有办法把它转成XML?
  • XML 是默认值。只需删除 JsonMediaTypeFormatter.DefaultMediaType 参数,您将拥有:var response = req.CreateResponse(HttpStatusCode.OK, myJSON);
  • 我认为这是最好的答案,因为格式化程序已经使用 Newtonsoft。您应该调用函数 GetPerson() 而不是 GetJson()。该函数返回的不是 Json,而是一个对象,乍一看令人困惑。
【解决方案5】:

JSON 非常简单,Newtonsoft.Json 库是 special case。您可以通过在脚本文件的顶部添加它来包含它:

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

【讨论】:

  • 但是我如何从Run 方法返回它呢? Run 方法返回不是字符串的HttpResponseMessage。但是,我不想返回原始字符串。相反,我想返回 JSON。
  • 一种方法就是手动创建一个HttpResponseMessage。使用 Json 将其内容设置为 StringContent。
  • 不错,有没有办法把它转成XML?
  • 我认为这应该是一个单独的问题(除非已经存在)。大多数人不会在 cmets 中找到答案。
【解决方案6】:

您可以将方法签名更改为:

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

它将允许返回 JSON 数据。

【讨论】:

  • 刚刚在 Azure 门户上尝试过,这也帮助我返回了 JSON:return req.CreateResponse(HttpStatusCode.OK, result, "application/json");,无需使用方法签名
【解决方案7】:

我遇到了类似的问题,这似乎是最受欢迎的没有答案的帖子。在确定了哪个节点之后,下面的内容应该可以工作,并准确地为您提供您所追求的。其他示例仍然返回一个字符串表示,这将返回 JSON。

记得使用 System.Text 声明;并添加:

return JsonConvert.SerializeObject(person);

根据 Juunas 的响应发送到 GetJson 函数。

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

【讨论】:

    【解决方案8】:
    #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 }) ;
     }
    

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多