如何使用 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; }
}
然后使用 JsonMessage
和 JsonConvert
获得所需的负载。
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"
};
我正在努力以正确的格式创建从设备到 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; }
}
然后使用 JsonMessage
和 JsonConvert
获得所需的负载。
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"
};