C# 如何从Azure函数返回JSON
我在玩。然而,我觉得我在一件非常简单的事情上被难住了。我试图找出如何返回一些基本的JSON。我不知道如何创建一些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) {
#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);
}