2017-01-19 11 views
0

I以下のJSONデータがあります。C#Deserialising JSONデータ配列

{"status": "ok", 
"data": [ 
    {"ts": "2016-12-12 02:00:00", "temp": 29.6}, 
    {"ts": "2016-12-12 02:30:00", "temp": 29.4}, 
]} 

しかし列を:列/フィールド名が含まれるであろう

{"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 
]} 

で、理想の世界では、データを名前がありません。私は、次のクラス構造にデータを取得する方法を知っていただきたいと思います:

#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 

私が使用してデータをdeserialisingています次:このコードは、SQL Server 2008 R2で使用されている

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#を使用したSSISパッケージ私は 'ステップスルー'することができず、スクリプトコンポーネントのコードをデバッグすることができません。なぜ私はそれを動作させることができないのかについての正確なエラーメッセージを得ることができません。

私のJSONクラスの正しい書式設定についての助言をいただければ幸いです。

答えて

0

jsonデシリアライズ用にJson.NETパッケージを使用できます。それは

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の命名を使用することも検討してください。

+0

あなたの助けセルゲイのおかげで、しかし、Iコードbuidsしばらくは、私は新しいエラーを取得する:Microsoft.SqlServer.Dts.Pipeline.CannotCreateUserComponentException:データフロータスク[スクリプトコンポーネント[184]]でパッケージの検証エラー エラーユーザーコンポーネントクラスを作成できません。 SSISScriptComponentEntryPointAttributeでマークされたクラスがスクリプトに存在することを確認してください。 データフロータスク[SSIS.Pipeline]でエラー: "コンポーネント"スクリプトコンポーネント "(184)"が検証に失敗し、検証ステータス "VS_ISBROKEN"が返されました。このエラーは、Newtonsoft.Json.DLLを参照した後にのみ発生します。私はそれを削除する場合、それは動作します。 – Lorettac242

+0

このエラーは、Newtonsoft.Json.Dllとそれに対応するコードをインストールして参照した後にのみ発生し始めました。私がそれを削除すると、コードが再び実行されます(たとえそれが私に必要なデータを与えていなくても)。このコードは、Visual Studioの後のバージョンでも完全に機能します。 – Lorettac242

関連する問題