动态生成 JSON 个对象

Generate JSON object dynamically

我有一个 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 中的值是来自 CSV 的 JSON,它不是常量,会随 CSV 的每一行而变化。

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

                            }
                        };

但由于我不确定该节点中将包含什么,因此我无法在入站 class 中定义属性。

我试过像这样使用动态:

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

此表达式的右侧是来自 CSV 的值。

如何动态找出入站节点下需要哪些属性。我本可以简单地更新模型以将入站 属性 设置为 JObject,然后在创建模型时为其分配值,但我需要通过在数据库中查找来转换入站节点的所有值。

有什么办法可以实现吗?

您可以将 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"}