C# 如何从Azure函数返回JSON

C# 如何从Azure函数返回JSON,c#,json,azure,azure-functions,C#,Json,Azure,Azure Functions,我在玩。然而,我觉得我在一件非常简单的事情上被难住了。我试图找出如何返回一些基本的JSON。我不知道如何创建一些JSON并将其返回到我的请求中 曾几何时,我会创建一个对象,填充它的属性,并序列化它。所以,我开始走这条路: #r "Newtonsoft.Json" using System.Net; public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) {

我在玩。然而,我觉得我在一件非常简单的事情上被难住了。我试图找出如何返回一些基本的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; }
}
#r“Newtonsoft.Json”
Net系统;
公共静态异步任务运行(HttpRequestMessage请求、TraceWriter日志)
{
log.Info($“运行函数”);
试试{
log.Info($“函数已运行”);
var myJSON=GetJson();
//我希望myJSON看起来像:
// {
//名字:'约翰',
//姓氏:“Doe”,
//订单:[
//{id:1,描述:'..'},
//     ...
//   ]
// }
返回?;
}捕获(例外情况除外){
//TODO:返回/日志异常
返回null;
}
}
公共静态?GetJson()
{
var person=新的person();
person.FirstName=“约翰”;
person.LastName=“Doe”;
person.Orders=新列表();
添加(新订单(){Id=1,Description=“…”});
?
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共列表顺序{get;set;}
}
公共阶级秩序
{
公共int Id{get;set;}
公共字符串说明{get;set;}
}

然而,我现在完全陷入了序列化和返回过程中。我想我习惯于在ASP.NET MVC中返回JSON,在ASP.NET MVC中,一切都是一个动作

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);
}
公共静态字符串GetJson()
{
var person=新的person();
person.FirstName=“约翰”;
person.LastName=“Doe”;
person.Orders=新列表();
添加(新订单(){Id=1,Description=“…”});
返回JsonConvert.SerializeObject(person);
}

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

public static async Task<object> Run(HttpRequestMessage req, TraceWriter log)
公共静态异步任务运行(HttpRequestMessage请求,TraceWriter日志)

它将允许返回JSON数据。

我有一个类似的问题,这似乎是没有答案的最受欢迎的帖子。在计算出哪个节点是有效的之后,下面的内容应该会给你准确的答案。其他示例仍然返回一个字符串表示形式,返回JSON

记住使用System.Text声明;并加上:

return JsonConvert.SerializeObject(person);
根据Juunas的响应,调用GetJson函数

返回新的HttpResponseMessage(HttpStatusCode.OK)
{
Content=newstringcontent(GetJson(),Encoding.UTF8,“application/json”)

};以下是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")
    };
}

您可以从

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
或者汇编
System.Web.Http
中的任何其他重载


有关

的更多信息看起来,只需使用“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; }
    }
[FunctionName(“StackOverflowReturnJson”)]
公共静态HttpResponseMessage运行([HttpTrigger(“get”、“post”、Route=“StackOverflowReturnJson”)]HttpRequestMessage请求,TraceWriter日志)
{
log.Info($“运行函数”);
尝试
{
log.Info($“函数已运行”);
var myJSON=GetJson();//注意:这实际上返回“Person”的实例
//我希望myJSON看起来像:
// {
//名字:'约翰',
//姓氏:“Doe”,
//订单:[
//{id:1,描述:'..'},
//     ...
//   ]
// }
var response=req.CreateResponse(HttpStatusCode.OK,myJSON,JsonMediaTypeFormatter.DefaultMediaType);//DefaultMediaType=“application/json”执行“技巧”
返回响应;
}
捕获(例外情况除外)
{
//TODO:返回/日志异常
返回null;
}
}
公共静态Person GetJson()
{
var person=新的person();
person.FirstName=“约翰”;
person.LastName=“Doe”;
person.Orders=新列表();
添加(新订单(){Id=1,Description=“…”});
返回人;
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共列表顺序{get;set;}
}
公共阶级秩序
{
公共int Id{get;set;}
公共字符串说明{get;set;}
}

最简单的方法也许是

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "/jsontestapi")] HttpRequest req,
    ILogger log)
{
    return new JsonResult(resultObject);
}
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,Route=“/jsontestapi”)]HttpRequest请求,
ILogger日志)
{
返回新的JsonResult(resultObject);
}

将内容类型设置为
application/json
,并在响应正文中返回json。

但是如何从
Run
方法返回该内容?
Run
方法返回一个非字符串的
HttpResponseMessage
。但是,我不想返回原始字符串。相反,我想返回JSON,一种方法是手动创建HttpResponseMessage。使用Json将其内容设置为StringContent。您可以在这里看到一个示例:很好,有没有办法将其转换为XML?我认为这应该是一个单独的问题(除非已经存在)。大多数人不会在评论中找到答案。只是在Azure portal上尝试了一下,这也帮助我返回了JSON:
return req.CreateResponse(HttpStatusCode.OK,result,“application/JSON”),不玩方法签名您有一些答案-请将其中一个标记为问题的答案。我提供了一份报告
[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; }
    }
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "/jsontestapi")] HttpRequest req,
    ILogger log)
{
    return new JsonResult(resultObject);
}