2017-08-09 79 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!

相关问题