I have a model that looks like:
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; }
}
My collection is returning result in the following format
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
I want to serialize the above collection so that I can generate the following 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"
}]
}
}
I just can't get the iteration working. How can I iterate the collection to create the object of my model class to serialize it later?
This will turn your collection into that object model that you can then serialize to 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);
Notice though that SearchData is a collection and not a single item like in your code above:
public class SearchResult
{
public bool Success { get; set; }
public List<SearchData> Data { get; set; }
}
The JSON part I took from here
This sounds like a classic group by question. Here is a self-contained example that should copy-paste compile into any test class.
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);
}}
Sample json output:
[
{
"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"
}
]
}
]
Try this.
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")
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.