如何使用 Azure 客户端 SDK 发送 json 对象而不是字符串

How to send a json object instead of a string with Azure Client SDK

我正在努力以正确的格式创建从设备到 IotHub 的消息。

我正在使用 Azure 客户端 SDK (Microsoft.Azure.Devices.Client)

为了更好地理解让我们从一个小例子开始,我们有以下字符串:

var TableName = "table01";
var PartitionKey = "key01";
string messagePayload = $"{{\"tablename\":\"{TableName}\",\"partitionkey\":\"{PartitionKey}\"}}";

(取自例子Send device to cloud telemetry)我们创建一个eventMessage

using var eventMessage = new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(messagePayload))
{
    ContentEncoding = Encoding.UTF8.ToString(),
    ContentType = "application/json"
};

然后发送到云端:

Console.WriteLine(messagePayload);
await deviceClient.SendEventAsync(eventMessage);

writeline 的输出,这正是我最初想要的:

{"tablename":"table01","partitionkey":"key01"}

我在 shell 中看到了关于 的答案:

{
    "event": {
        "origin": "WinSensorTest",
        "module": "",
        "interface": "",
        "component": "",
        "payload": "{\"tablename\":\"table01\",\"partitionkey\":\"key01\"}"
    }
}

问题是,我希望它看起来像下面的代码,或者完全没有“事件”等,只有上面的字符串。

{
   "event":{
      "origin":"WinSensorTest",
      "module":"",
      "interface":"",
      "component":"",
      "payload":{
         "tablename":"table01",
         "partitionkey":"key01"
      }
   }
}

我哪里错了,payload怎么会是正确的json格式?

编辑:

我刚刚在 Java 中尝试了相同的方法,结果相同。为什么这不起作用,或者在 shell 中看到的数据未正确解析?

如果你先创建一个合适的 Json 对象,它就可以工作,并且在 shell 中也正确显示 - 有趣的是,仅针对这个 c# 项目,我尝试在 Java 中做同样的事情在 Android 上,即使在使用 gson 创建对象后,同样奇怪的格式化内容仍然会发生。

解决方案:

class JsonMessage
{
        public string tablename { get; set; }
        public string partitionkey { get; set; }
}

然后使用 JsonMessageJsonConvert 获得所需的负载。

JsonMessage newMsg = new JsonMessage()
    {
        tablename = "table01",
        partitionkey = "key01",
    };

string payload = JsonConvert.SerializeObject(newMsg);


using var eventMessage = new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes(payload))
    {
        ContentEncoding = Encoding.UTF8.ToString(),
        ContentType = "application/json"
    };