Генерировать JSON объект динамически - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть CSV, который я анализирую, чтобы преобразовать в JSON и затем, наконец, загрузить в Azure blob.

Это пример CSV, который я читаю и анализирую. Каждая строка будет иметь свой собственный файл JSON.

humidity_sensor,    sensor1, {"temp":"22.3","batt":"3.11","ss":"28","humidity":"52.6","dp":"12.144704512672"}
humidity_sensor,    sensor1, {"batt":"3.14","ss":"16","humidity":"56.9","timestamp":1556568624,"temp":"21.7","dp":"12.784662018281"}
humidity_sensor,    sensor1, {"pressure":"5.14","prop2":"16","current":"56.9","temp":"21.7","dp":"12.784662018281"}

Это модель, к которой я хочу сериализовать ее:

public class SensorModel
    {
        [JsonProperty("sensorId")]
        public string SensorId { get; set; }

        [JsonProperty("Inbound_data")]
        public Inbound Inbounddata { get; set; }
        [JsonProperty("ts")]
        public DateTime Ts { get; set; }
    }

    public class Inbound
    {
    }

Таким образом, вывод имеет следующий формат:

   {
   "sensorId":"sensor1",
   "data_in":{

   },
   "ts":"2020-02-11T18:07:29Z"
}

Значение в Inbound - JSON от CSV, которое не является постоянным и будет изменяться с каждой строкой CSV.

SensorModel sensorModel = new SensorModel 
                        {
                            SensorId = sensorId,
                            Ts = utcTimestamp,
                            Inbounddata  = new Inbound
                            {

                            }
                        };

Но так как я не уверен, что будет в этом узле, я не могу определить свойства во входящем классе.

Я попытался использовать Dynami c следующим образом:

dynamic data = JObject.Parse(values[r, 4].ToString());

Правая часть этого выражение это значение из CSV.

Как я могу динамически выяснить, какие свойства требуются для входящего узла. Я мог бы просто обновить модель, чтобы установить входящее свойство как JObject, а затем при создании модели присвоить ему значение, но мне нужно преобразовать все значения входящего узла, посмотрев в базу данных.

Есть ли способ достичь этого?

1 Ответ

1 голос
/ 24 февраля 2020

Вы можете объявить Inbounddata как Dictionary<string,string>

public class SensorModel
{
    [JsonProperty("sensorId")]
    public string SensorId { get; set; }

    [JsonProperty("data_in")]
    public Dictionary<string,string> Inbounddata { get; set; }
    [JsonProperty("ts")]
    public DateTime Ts { get; set; }
}

Например,

var sensorModel = new SensorModel
{
    SensorId = "2",
    Ts = DateTime.Now,
    Inbounddata = new Dictionary<string,string>
    {
        ["temp"] = "22.5",
        ["batt"] = "3.11",
        ["ss"] = "22"
    }

};

var result = JsonConvert.SerializeObject(sensorModel);

Выход

{"sensorId":"2","data_in":{"temp":"22.5","batt":"3.11","ss":"22"},"ts":"2020-02-24T20:46:39.9728582+05:30"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...