2016-07-26 76 views
0

我有一个模型,看起来像:遍历集合并创建一个嵌套的对象

public class SearchResult 
{ 
    public bool success { get; set; } 
    public SearchData data { get; set; } 
} 

public class SearchData 
{ 
    public string UploadDate { get; set; } 
    public List<UserImages> Images { get; set; } 
} 

public class UserImages 
{ 
    public string Filename { get; set; } 
    public string FileId { get; set; } 
} 

我收藏在下面的格式返回结果

FileId FileName UploadDate 
148847 IMG_1.JPG Mar-2012 
135710 IMG_8.JPG Mar-2012 
143817 IMG_6.JPG Jul-2013 
143873 IMG_5.JPG Aug-2014 
145766 IMG_4.JPG Aug-2015 
145820 IMG_3.JPG Jan-2016 
145952 IMG_2.JPG Jan-2016 

我想要序列上述集合,以便我可以生成以下JSON:

{ 
    "success": true, 
    "SearchData": { 
     "UploadDate": "MAR-2012", 
     "UserImages": [{ 
      "Filename": "IMG_1.JPG", 
      "FileId ": "148847" 
     }, { 
      "Filename": "IMG_8.JPG", 
      "FileId ": "135710" 
     }], 
     "UploadDate": "Jul-2013", 
     "UserImages": [{ 
      "Filename": "IMG_6.JPG", 
      "FileId ": "143817" 
     }] 
    } 
} 

我只是无法获得迭代工作。我如何迭代集合来创建我的模型类的对象,以便以后序列化它?

+1

哪里是你的代码来创建JSON? – 2016-07-26 13:59:13

+0

通过json2csharp.com反向工程你的JSON - 看起来你的'FileId'将是一个无效的属性名称 - 你可以尝试改变它到别的,然后再次序列化你的JSON?你用什么来序列化到JSON? –

+0

我正在使用ASP.Net Web API,它将以JSON格式返回所有内容。所以,需要一个根对象,并且控制器方法会将其隐式序列化为JSON。 – user1640256

回答

2

这会将您的集合转换为可以序列化为JSON的对象模型。

var result = new SearchResult 
{ 
    Success = true, 
    SearchData = results.GroupBy(item => item.UploadDate, 
       (key, grouping) => new SearchData 
       { 
        UploadDate = key, 
        Images = grouping.Select(item => new UserImage 
        { 
         FileName = item.FileName, 
         FileId = item.FileId 
        }).ToList() 
       }).ToList() 
}; 

var json = new JavaScriptSerializer().Serialize(result); 
var json_otherWay = Newtonsoft.Json.JsonConvert.SerializeObject(result); 

注意虽然这SearchData是一个集合而不是一个单一的项目如上面代码:

public class SearchResult 
{ 
    public bool Success { get; set; } 
    public List<SearchData> Data { get; set; } 
} 

的JSON一部分,我从here

+0

我在新的SearchResult类定义中添加了,以清楚(er)它需要修改。 – RoadieRich

+0

@RoadieRich - 如果它解决了你的问题,请考虑标记问题为答案:) –

+0

它的确如此。谢谢。 – user1640256

0

试试这个。

using Newtonsoft.Json; 

public class SearchData 
{ 
    public string UploadDate { get; set; } 
    public List<UserImages> Images { get; set; } 
    public bool success { get; set; } 
} 

public class UserImages 
{ 
    public string Filename { get; set; } 
    public string FileId { get; set; } 
} 

var result= JsonConvert.DeserializeObject<List<SearchData>>("JsonString") 
1

这听起来像一个典型的组通过了题。这是一个自包含的示例,应该将编译复制粘贴到任何测试类中。

public class SearchResult 
{ 
    public bool success { get; set; } 
    public SearchData data { get; set; } 
} 

public class SearchData 
{ 
    public string UploadDate { get; set; } 
    public IEnumerable<UserImages> Images { get; set; } 
} 

public class UserImages 
{ 
    public string Filename { get; set; } 
    public string FileId { get; set; } 
} 

public class FlatData 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

public static void Test() 
{ 
    //generate arbitrary dates to group on 
    var dates = Enumerable.Range(0, 3).Select(x => DateTime.Today.AddDays(x)).ToArray(); 
    //generate some sample data in the flat format 
    var flatData = Enumerable.Range(1, 10).Select(x => new FlatData() { Id = x.ToString(), Name = "Image_" + x, Date = dates[x % 3] }); 

    //group the flat data into the hierarchical format 
    var grouped = from item in flatData 
        group item by item.Date into g 
        select new SearchData() 
        { 
         UploadDate = g.Key.ToShortDateString(), 
         Images = from img in g 
           select new UserImages() 
           { 
            FileId = img.Id, 
            Filename = img.Name 
           } 
        }; 

    //Serialization implementation abstracted, as it should be 
    var json = Common.Helper.SerializeJSON(grouped); 
}} 

样品JSON输出:

[ 
    { 
     "UploadDate":"7/27/2016", 
     "Images":[ 
     { 
      "Filename":"Image_1", 
      "FileId":"1" 
     }, 
     { 
      "Filename":"Image_4", 
      "FileId":"4" 
     }, 
     { 
      "Filename":"Image_7", 
      "FileId":"7" 
     }, 
     { 
      "Filename":"Image_10", 
      "FileId":"10" 
     } 
     ] 
    }, 
    { 
     "UploadDate":"7/28/2016", 
     "Images":[ 
     { 
      "Filename":"Image_2", 
      "FileId":"2" 
     }, 
     { 
      "Filename":"Image_5", 
      "FileId":"5" 
     }, 
     { 
      "Filename":"Image_8", 
      "FileId":"8" 
     } 
     ] 
    }, 
    { 
     "UploadDate":"7/26/2016", 
     "Images":[ 
     { 
      "Filename":"Image_3", 
      "FileId":"3" 
     }, 
     { 
      "Filename":"Image_6", 
      "FileId":"6" 
     }, 
     { 
      "Filename":"Image_9", 
      "FileId":"9" 
     } 
     ] 
    } 
]