Как отправить объект json вместо строки с помощью Azure Client SDK

Я изо всех сил пытаюсь создать сообщение с устройства в IoTHub в правильном формате.

Я использую пакет SDK для клиента Azure (Microsoft.Azure.Devices.Client).

Для лучшего понимания давайте начнем с небольшого примера, у нас есть следующая строка:

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

(Взято из примера Отправить устройство в облачную телеметрию) мы создаем сообщение о событии

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);

Вывод из строки записи, чего я и хотел в первую очередь:

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

Что я вижу в оболочке после ответа на просмотр входящих сообщений IoTHub:

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

Проблема в том, что я хочу, чтобы это выглядело как код ниже или полностью без события и т. д., только строка выше.

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

Где я ошибся, как полезная нагрузка может быть в правильном формате json?

Редактировать:

Я только что попробовал то же самое на Java, с тем же результатом. Почему это не работает, или данные, видимые в оболочке, анализируются неправильно?


person chris    schedule 07.07.2021    source источник
comment
Кажется, здесь происходит какая-то интерпретация. У вас явно есть двойные кавычки в строке, которую вы кодируете в байты, но в полезной нагрузке, которую вы видите, отсутствуют двойные кавычки вокруг имени таблицы и ключа.   -  person Lasse V. Karlsen    schedule 09.07.2021
comment
@LasseV.Karlsen Прошу прощения, это была ошибка в вопросе, так как я немного подверг цензуре вывод и пропустил эти \   -  person chris    schedule 09.07.2021
comment
Я предполагаю, что то, что вы видите в оболочке, вообще не анализируется. Полезная нагрузка может быть всем, если это может быть [] байт или поток (байтов). Таким образом, может быть немного сложно правильно отформатировать все на консоли. Но это всего лишь предположение   -  person Sascha    schedule 09.07.2021


Ответы (1)


Если вы сначала создаете правильный объект Json, он работает, а также отображается правильно в оболочке - интересно только для этого проекта С#, я пытался сделать то же самое в 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"
    };
person chris    schedule 12.07.2021