首页 > 解决方案 > 在 Azure Function 中处理从查询到 Azure IOT Hub 的 JSON 响应

问题描述

我是 C# 新手,无法将查询处理为所需格式。如果我以这种方式运行代码,则响应是:

["{\r\n  \"Plant\": \"1195118\"\r\n}","{\r\n  \"Plant\": \"1195157\"\r\n}"]

这不是预期的结果。实际所需的输出是以下格式的 JSON:

{
"plant":["123235", "1195157"]
}

我正在使用的代码如下。我已经尝试了几个选项,但我在 C# 处理 JSON 时遇到了困难。

任何帮助,将不胜感激。谢谢。

string queryString = "SELECT properties.reported.Plant_Number FROM devices WHERE properties.reported.Plant_Number != null";
IQuery query = registryManager.CreateQuery(queryString);
var json = (await query.GetNextAsJsonAsync());
return (ActionResult)new OkObjectResult(json);

标签: c#jsonazureazure-functionsazure-iot-hub

解决方案


您想要的 JSON 是一个对象,而您得到的 JSON 是一个数组,其中一个条目是一个字符串。简而言之:您需要解析 JSON。

var json = (await query.GetNextAsJsonAsync()); 
return (ActionResult)new OkObjectResult(json);

第一行返回一个可枚举的字符串,第二行将它返回给调用者。所以这就是为什么你得到的结果是一个带有字符串的数组。

如果您希望它返回 JSON,则需要解析字符串。为此,您可以使用 NewtonSoft.Json 库中的 JsonConvert 类(默认情况下与您的函数一起提供)。你可以在这里了解。

在作者评论后编辑:

var jsonStrings = await query.GetNextAsJsonAsync();
var deviceProperties = jsonStrings.Select(JsonConvert.DeserializeObject<DeviceProperty>);
return (ActionResult)new OkObjectResult(deviceProperties);

public class DeviceProperty
{
    public string Plant { get; set; }
}

推荐阅读