2017-08-09 40 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" 
     } 
    ] 
    } 
] 

我試圖通過循環FIELDNAMES但後來我有一個字段名稱的所有結果,並不得不尋找其他的字段名在同一個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!

相關問題