2017-08-09 14 views
2

お互いに関連するリストをループしてjsonノードに書き込むときに問題を起こしています。私はこのようなクラスを持っている:リストのリスト内の特定のレコードを取得する方法

public class RequiredField 
{ 
    public string FieldName { get; set; } //varchar(100) 
    public List<RequiredFieldColumnValue> RequiredFieldColumnValues { get; set; } 
} 
public class RequiredFieldColumnValue 
{ 
    public int Id { get; set; } 
    public int ItemNumber { get; set; } 
    public int LineNumber { get; set; } 
    public dynamic Value { get; set; } 
} 

例の応答は次のようになります。

var requiredFields = new List<RequiredField> 
{ 
    new RequiredField 
    { 
     FieldName = "FirstName", 
     RequiredFieldColumnValues = new List<RequiredFieldColumnValue> 
     { 
      new RequiredFieldColumnValue 
       {Id = 0, ItemNumber = 1, LineNumber = 1, Value = "Dave"}, 
      new RequiredFieldColumnValue 
       {Id = 1, ItemNumber = 1, LineNumber = 1, Value = "Joey"}, 
      new RequiredFieldColumnValue 
       {Id = 2, ItemNumber = 1, LineNumber = 1, Value = "Derek"}, 
      new RequiredFieldColumnValue 
       {Id = 3, ItemNumber = 3, LineNumber = 2, Value = "Bill"}, 
      new RequiredFieldColumnValue 
       {Id = 4, ItemNumber = 3, LineNumber = 3, Value = "Steve"}, 
      new RequiredFieldColumnValue 
       {Id = 5, ItemNumber = 3, LineNumber = 3, Value = "James"}, 
     } 
    }, 
    new RequiredField 
    { 
     FieldName = "LastName", 
     RequiredFieldColumnValues = new List<RequiredFieldColumnValue> 
     { 
      new RequiredFieldColumnValue 
       {Id = 0, ItemNumber = 1, LineNumber = 1, Value = "Smith"}, 
      new RequiredFieldColumnValue 
       {Id = 1, ItemNumber = 1, LineNumber = 1, Value = "Pell"}, 
      new RequiredFieldColumnValue 
       {Id = 2, ItemNumber = 1, LineNumber = 1, Value = "Duncan"}, 
      new RequiredFieldColumnValue 
       {Id = 3, ItemNumber = 3, LineNumber = 2, Value = "Gutmann"}, 
      new RequiredFieldColumnValue 
       {Id = 4, ItemNumber = 3, LineNumber = 3, Value = "Rogers"}, 
      new RequiredFieldColumnValue 
       {Id = 5, ItemNumber = 3, LineNumber = 3, Value = "Johnson"}, 
     } 
    }, 
}; 

今の問題は、私は)(JArrayにこれらを記述する方法です。それは次のようになります。

[ 
    { 
    "Item": 1, 
    "Lines": [ 
     { 
     "LineNumber": 1, 
     "buyer": [ 
      { 
      "FirstName": "Dave", 
      "LastName": "Smith" 
      }, 
      { 
      "FirstName": "Joey", 
      "LastName": "Pell" 
      }, 
      { 
      "FirstName": "Derek", 
      "LastName": "Duncan" 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "Item": 3, 
    "Lines": [ 
     { 
     "LineNumber": 2, 
     "buyer": [ 
      { 
      "FirstName": "Bill", 
      "LastName": "Gutmann" 
      } 
     ] 
     } 
    ], 
    "LineNumber": 3, 
    "buyer": [ 
     { 
     "FirstName": "Steve", 
     "LastName": "Rogers" 
     }, 
     { 
     "FirstName": "James", 
     "LastName": "Johnson" 
     } 
    ] 
    } 
] 

私はフィールド名をループしてみましたが、その後、私は一つのフィールド名のすべての結果を持っていたし、他のフィールド名の中に同じIDを見つけなければならなかったが、私はループにまだありました。これに関する助けがあれば大歓迎です。

答えて

0

これは非常に簡単であることが判明しました。

var fieldList = requiredField.SelectMany(
    a => a.RequiredFieldColumnValues 
     .Select(b => new 
     { 
      a.FieldName , 
      b.Id, 
      b.Value 
     })).GroupBy(x=>x.Id) 
     .Select(to=> new 
    { 
     Id = to.Key, 
     Group = to 
    }).Distinct().ToList(); 

これはリスト全体をフラット化し、それをIDでグループ化することができました。そして、それをループJSONを作成するには:その後、

buyer = new JArray(); 

if (fieldList.Any()) 
{ 
    foreach (var properties in fieldList) 
    { 
     dynamic savableObject = new JObject(); 
     foreach (var property in properties.Group) 
     { 
      savableObject.Add(property.FieldName, property.Value); 
     } 
    buyer.Add(savableObject); 
    } 
} 

はバイヤー出力:

{[ 
    { 
    "FirstName": "Dave", 
    "LastName": "Smith" 
    }, 
    { 
    "FirstName": "Joey", 
    "LastName": "Pell" 
    },... 

その後、私はちょうどItemNumberとLineArray持つ配列をラップすることができます。

0

Nugetパッケージマネージャで利用可能なJSON.Netライブラリを使用すると、JSONのシリアル化/逆シリアル化を使用できます。

jsonにオブジェクトをシリアライズすると、オブジェクトがjson文字列に変換されます(これはあなたが望むように見えます)。

シリアライズ:(requiredFieldsを使用すると、それがすでに作成されていると仮定して、あなたのコードを持っているオブジェクト)

var jsonString = JsonConvert.SerializeObject(requiredFields); 
Console.WriteLine(jsonString); // Just to see the output 

デシリアライズ:(上からjsonString出力を使用)

var myNewObject = JsonConvert.DeserializeObject<List<RequiredField>>(jsonString); 

デシリアライズの場合は、宛先タイプを<>DeserializeObject<>

に指定する必要があります

using Newtonsoft.Json;

・ホープ、この助けを借りて、あなたのファイルの先頭にJson.Netをインポートすることを忘れないでください!

関連する問題