C#反序列化缺少列名的Json数据数组

时间:2017-01-19 00:39:00

标签: c# json

我有以下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类的任何帮助。

1 个答案:

答案 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命名。