我正在尝试反序列化 Azure 函数应用程序中的字符串输入。我的输入是
[{"messageid":1,
"deviceid":"Android",
"temperature":20.0,
"humidity":47.0,
"eventprocessedutctime":"2017-12-01T10:35:57.8331048Z",
"result1":{"temperature":"20","humidity":"47","Scored Labels":"NO","Scored Probabilities":"0.450145334005356"}}]
我尝试使用这段代码运行。
#r "Newtonsoft.Json"
using System.Configuration;
using System.Text;
using System.Net;
using Microsoft.Azure.Devices;
using Newtonsoft.Json;
// create proxy
static Microsoft.Azure.Devices.ServiceClient client = ServiceClient.CreateFromConnectionString(ConfigurationManager.AppSettings["myIoTHub"]);
public static async Task<HttpResponseMessage> Run(string input, HttpRequestMessage req, TraceWriter log)
{
log.Info($"ASA Job: {input}");
var data = JsonConvert.DeserializeAnonymousType(input, new { deviceid = "" });
if (!string.IsNullOrEmpty(data?.deviceid))
{
string deviceId = data.deviceid;
// string deviceId = data[0].deviceid;
log.Info($"Device: {deviceId}");
// cloud-to-device message
var msg = JsonConvert.SerializeObject(new { input });
var c2dmsg = new Microsoft.Azure.Devices.Message(Encoding.ASCII.GetBytes(msg));
// send AMQP message
await client.SendAsync(deviceId, c2dmsg);
}
return req.CreateResponse(HttpStatusCode.NoContent);
}
我感兴趣的是 deviceid 和 Scored Labels。但现在我什至无法提取其中之一。还有一些评分标签由空格组成。 result1是Azure机器学习返回的结果,因此似乎无法重命名。
你的问题是你的根JSON http://json.org/容器是一个数组,而不是一个对象:
正如中所解释的Json.NET 文档 https://www.newtonsoft.com/json/help/html/serializationguide.htm#Lists,JSON数组需要反序列化为集合,例如.Net数组。因此你可以这样做:
var dataArray = JsonConvert.DeserializeAnonymousType(input, new [] { new { deviceid = "" } });
var data = dataArray.SingleOrDefault();
Sample fiddle https://dotnetfiddle.net/l9R4tF.
如果您发现需要从 JSON 中提取的不仅仅是一两个属性,您可能需要创建要反序列化的显式类型。为此,您可以使用http://json2csharp.com/ http://json2csharp.com/ or 将 JSON 粘贴为类 https://stackoverflow.com/q/18526659/3744182.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)