我有以下Json数据:
{"status": "ok",
"data": [
{"2016-12-12 02:00:00": 29.6},
{"2016-12-12 02:30:00": 29.4},
{"2016-12-12 03:00:00": 28.9},
...... many more records
]}
在理想世界中,数据将包括列/字段名称:
{"status": "ok",
"data": [
{"ts": "2016-12-12 02:00:00", "temp": 29.6},
{"ts": "2016-12-12 02:30:00", "temp": 29.4},
]}
但是缺少列名。我想知道如何将数据检索到以下类结构中:
#region JSON Class
public class telemetryData
{
public string ts { get; set; }
public double temp { get; set; }
}
public class RootObject
{
public string status { get; set; }
public List<telemetryData> data { get; set; }
}
#endregion
我使用以下内容对数据进行反序列化:
JavaScriptSerializer sr = new JavaScriptSerializer();
jsonResponse = sr.Deserialize<RootObject>(jsonString);
foreach (var item in jsonResponse.data)
{
OutputMoistureBuffer.AddRow();
OutputMoistureBuffer.ts = item.ts;
OutputMoistureBuffer.temp = item.temp;
}
此代码正在使用VS2008 C#在SQL Server 2008 R2 SSIS包中使用。我无法跨越&#39;并调试脚本组件中的代码,因此我无法得到准确的错误消息,告诉我为什么我无法让它工作。
非常感谢有关正确格式化JSON类的任何帮助。
答案 0 :(得分:0)
您可以使用Json.NET包进行json反序列化。它允许编写自定义转换器
public class TelemetryDataConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(telemetryData);
}
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = JObject.Load(reader);
var property = (JProperty)obj.First;
return new telemetryData {
ts = property.Name,
temp = property.Value.Value<double>()
};
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,您可以将自定义转换器属性放入您的类,或将转换器传递给反序列化器:
[JsonConverter(typeof(TelemetryDataConverter))]
public class telemetryData
{
public string ts { get; set; }
public double temp { get; set; }
}
反序列化将如下所示:
var data = JsonConvert.DeserializeObject<RootObject>(json);
注意:考虑将日期字符串解析为DateTime对象。还要考虑对类和属性使用PascalCase命名。