2016-07-26 3 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? –

+0

Обратное проектирование вашего JSON через json2csharp.com - похоже, что ваш '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" 
     } 
     ] 
    } 
] 
Смежные вопросы