动态生成 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"}
我有一个 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"}