2017-01-11 7 views
1

私はJSON配列を持っています。私は、これを次のクラスにマップ/デシリアライズする必要があります。C#でJSONオブジェクトをデシリアライズするにはNewtonsoft json.net

public sealed class DataItem{ 
    public string UserId {get; set;} 
    public string TestId {get; set;} 
    public string UserName{get; set;} 
    public string Data1 {get; set;} 
    public string Data2 {get; set;} 
    public string Data3 {get; set;} 
    public string Data4 {get; set;} 
    public string Data5 {get; set;} 
    public string Data6 {get; set;} 
    public string Data7 {get; set;} 
    public string Data8 {get; set;} 
    public string Data9 {get; set;} 
    public string Data10 {get; set;} 
    ... 
    ... 
} 

JSON配列:私のプログラムで

[{ 
    "UserId": "5656", 
    "TestId": "562", 
    "UserName": "testuser", 
    "Data1": "dang", 
    "Data2": "phy", 
    "Data3": "right", 
    "Data4": "left", 
    "Data5": "top", 
    "Data6": "abc", 
    "Data7": "rat", 
    "Data8": "test", 
    "Data9": "91", 
    "Data10": "9090", 
    ... 
    ... 
}, { 
    "UserId": "8989", 
    "TestId": "12", 
    "UserName": "abc", 
    "Data1": "111", 
    "Data2": "222", 
    "Data3": "Pwww", 
    "Data4": "aaa", 
    "Data5": "bbbb", 
    "Data6": "cc", 
    "Data7": "ooo", 
    "Data8": "hh", 
    "Data9": "g", 
    "Data10": "5656", 
    ... 
    ... 

}] 

私はこのようでした:

IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray); 

これが正常に動作します。

私の場合、データベースから来るData1からData1000のようなjson配列の中に約1000のデータがあります。以下のような そして、私は私のクラスで千件のデータを定義したくない「のDataItem」:

public sealed class DataItem{ 
    ... 
    ... 
    public string Data1 {get; set;} 
    public string Data2 {get; set;} 
    . 
    . 
    . 
    public string Data1000 {get; set;} 
} 

はData1000にそれらの千件のデータ(データ1をマッピングするために、いくつかの動的なクラスやオブジェクトを使用してこの問題を解決する方法はあります)。

私は1000の長さの配列を使用して、このようにマップすると思っていますが、これはうまくいきません。

public sealed class DataItem{ 
    public string UserId {get; set;} 
    public string TestId {get; set;} 
    public string[] Data {get; set;} 
} 

public DataItem(){ 
    Data = new string[1000]; 
} 

そして、私のプログラムで:

DataItem dataItem = new DataItem(); 
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray); 

P.S. JSON配列の構造を変更することはできません。

+0

DataItemクラスの代わりに動的オブジェクトを使用できますか? 'JsonConvert.DeserializeObject >(myJsonArray);'? – squillman

+0

あなたはこのような何かをすることができます 'dynamic data = Json.Decode(json); – Majid

答えて

2

あなたは少し異なる方法で試すことができます。

JObject obj = JObject.Parse(jsonString); // gets processed json object 
DataItem item = new DataItem(); 
item.UserId = obj.SelectToken("UserId").Value<string>(); 
//.. fill rest of the data 
string format = "Data{0}"; 
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x] 
{ 
    item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>(); 
} 

をそして、あなたは、のようないくつかの空想の方法にこれをパックすることができますよう

が問題(:

public DataItem DeserializeFromJson(string json) 
{ 
    // put that code in here 
} 

編集あなたは以前に言った)あなたはJson配列を持っているということです。私の方法では、配列から1つのオブジェクトを読むのが辛いことを示していました。

これでわかりやすくなりました。配列を逆シリアル化する場合は、JsonConvert.DeserializeObject<T>()メソッドを使用してList<JObject>に入力を逆シリアル化してから、DeserializeFromJson()メソッドを使用して上記のスニペットから作成することをお勧めします。これらを組み合わせること

は、あなたがこのような何かを達成することができます:

public IEnumerable<DataItem> DeserializeListFromJson(string jsonArray) 
{ 
    return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select(obj => DeserializeFromJson(obj)); 
} 

// updated 
public DataItem DeserializeFromJson(JObject obj) 
{ 
    DataItem result = new DataItem(); 
    item.UserId = obj.SelectToken("UserId").Value<string>(); 
    //.. fill rest of the data 
    string format = "Data{0}"; 
    for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x] 
    { 
     item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>(); 
    } 
} 
+0

こんにちはm.rogalski、私は同じことを試みました。しかし、JSON配列を最初の行に解析する際に例外が発生します。 –

+0

@KishorBikramOli最新の回答を読み、フィードバックをお願いします。 –

1

あなたはJSON文字列からのプロパティの動的な番号を保存するために辞書を使用することができます。

以下の例は、質問で提供されたJSON文字列を辞書のリストに変換する例です。リストの代わりに辞書の配列に変換することができます。

var jsonData = "[{\"UserId\":\"5656\",\"TestId\":\"562\",\"UserName\":\"testuser\",\"Data1\":\"dang\",\"Data2\":\"phy\",\"Data3\":\"right\",\"Data4\":\"left\",\"Data5\":\"top\",\"Data6\":\"abc\",\"Data7\":\"rat\",\"Data8\":\"test\",\"Data9\":\"91\",\"Data10\":\"9090\"},{\"UserId\":\"8989\",\"TestId\":\"12\",\"UserName\":\"abc\",\"Data1\":\"111\",\"Data2\":\"222\",\"Data3\":\"Pwww\",\"Data4\":\"aaa\",\"Data5\":\"bbbb\",\"Data6\":\"cc\",\"Data7\":\"ooo\",\"Data8\":\"hh\",\"Data9\":\"g\",\"Data10\":\"5656\"}]"; 

      var data = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonData); 

      Console.WriteLine("Total : {0}", data.Count); 
      Console.WriteLine("Item1 Total : {0}", data[0].Count); 
      Console.WriteLine("Item2 Total : {0}", data[1].Count); 

      foreach(var item in data) 
      { 
       Console.WriteLine("--- Propertie start-----"); 
       foreach(var kvPair in item) 
       { 
        Console.WriteLine("property name : {0}", kvPair.Key); 
        Console.WriteLine("property value : {0}", kvPair.Value); 
       } 
       Console.WriteLine("--- Propertie end-----"); 
      } 

      Console.ReadLine(); 

これが問題を解決します。

関連する問題