18

“我在这个函数中创建了一个 Azure 函数,我调用了一个返回 JSON 的 API。我想将此 JSON 解析为一个对象,以便我可以在函数中使用它。我不能不使用 Newton.JSON,因为该函数似乎不知道这个。我怎样才能解析 JSON?

4

4 回答 4

44

这是使用 JsonNet 序列化/反序列化对象的完整 Azure 函数源代码:

#r "Newtonsoft.Json"

using System.Net;
using Newtonsoft.Json;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    dynamic body = await req.Content.ReadAsStringAsync();
    var e = JsonConvert.DeserializeObject<EventData>(body as string);
    return req.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(e));
}

public class EventData
{
    public string Category { get; set; }
    public string Action { get; set; }
    public string Label { get; set; }
}

示例输入(请求正文):

{
    "Category": "Azure Functions",
    "Action": "Run",
    "Label": "Test"
}

样本输出:

"{\"Category\":\"Azure Functions\",\"Action\":\"Run\",\"Label\":\"Test\"}"
于 2016-09-23T13:44:04.713 回答
6

你上面的回答是返回一个字符串而不是 JSON。我建议您将答案修改如下:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    dynamic body = await req.Content.ReadAsStringAsync();
    var e = JsonConvert.DeserializeObject<EventData>(body as string);
    return req.CreateResponse(HttpStatusCode.OK, e);
}

这将返回没有 JSON 转义的示例输出:

{"Category":"Azure Functions","Action":"Run","Label":"Test"}
于 2016-12-28T19:38:43.803 回答
2

至于.Net Core 2:

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

然后你可以反序列化它:

dynamic jObject= JsonConvert.DeserializeObject(requestBody);

并完成您的答案(转换为对象):

JToken jCategory = jObject;
var whatever = jCategory["yourkeyiteminjson"].ToObject<YourObjectType>();

即向您展示它的灵活性:

假设这个 Json 输入:

{"companyId": "123456","payments": [{"id": "31212"},{"id": "31212"},{"id": "3"}],"miFees": [{"id": "452"},{"id": "254"}]}

您可以执行以下操作:

var companyId = jObject["companyId"].ToString();
var payments = jCategory["payments"].ToObject<List<PaymentTransaction>>();
于 2019-12-06T10:38:33.853 回答
0

在 Azure 函数中,您首先需要添加对 NewtonSoft.JSON 的引用。您可以通过“Newtonsoft.Json”执行此操作。不要忘记引号!!!

你可以通过 newtonsoft 使用正常的序列化:

var response = await client.GetAsync("<url>");
var json = await response.Content.ReadAsStringAsync();
var o= JsonConvert.DeserializeObject<"Type">(json);
于 2016-06-29T09:30:54.323 回答