C#JsonConvert.DeserializeAnonymousType失败

时间:2017-12-02 03:28:49

标签: c# azure json.net

我正在尝试反序列化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机器学习返回的结果,因此似乎无法重命名。

1 个答案:

答案 0 :(得分:1)

您的问题是您的根JSON容器是一个数组,而不是一个对象:

  • 数组是有序的值集合。数组以[(左括号)开头,以](右括号)结尾。值以,(逗号)分隔。

  • 对象是一组无序的名称/值对。对象以{(左大括号)开头,以}(右大括号)结束。

Json.NET docs中所述,需要将JSON数组反序列化为集合,例如.Net数组。因此你可以这样做:

var dataArray = JsonConvert.DeserializeAnonymousType(input, new [] { new { deviceid = "" } });
var data = dataArray.SingleOrDefault();

示例fiddle

如果您发现需要从JSON中提取多于一个或两个属性,则可能需要创建要反序列化的显式类型。为此,您可以使用http://json2csharp.com/Paste JSON as Classes