2016-07-26 4 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

json2csharp.comを介してJSONをリバースエンジニアリングすると、あなたの 'FileId'は無効なプロパティ名に見えます。それを他のものに変更してからJSONを再度シリアル化できますか?あなたはJSONにシリアル化するために何を使用していますか? –

+0

JSON形式のすべてを返すASP.Net Web APIを使用しています。そのため、ルートオブジェクトが必要であり、コントローラメソッドはそれを暗黙的にJSONにシリアル化します。 – user1640256

答えて

2

これは、コレクションをJSONにシリアル化できるオブジェクトモデルに変換します。そのSearchDataはコレクションではなく、単一の項目は上記のコードのようですが

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); 

お知らせ:

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

私はhere

+0

新しいSearchResultクラス定義を追加して、変更が必要であることを明確にしました。 – 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

これは古典的なグループによるように聞こえるから取ったJSONの一部質問。ここでは、コンパイルを任意のテストクラスにコピー・ペーストする必要がある自己完結型の例を示します。

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" 
     } 
     ] 
    } 
] 
関連する問題