2017-08-25 3 views
0

Json出力からJavaScriptSerializerを使用して確認してください。次に、json2csharp.comを使用して作成したクラスヘルパーiを確認します。問題はコントローラにあります。私は私の必要なJasonごとに正しい出力を得ていません。私はコントローラで正しいと思いますか?どこに問題がありますか?具体的なことを知りたいのであれば質問してください。C#クラスから正しいjson出力を得る

ヘルパークラスコード:

public class ItemsFromFile 
    { 
     public string ASIN { get; set; } 
     public string Title { get; set; } 
     public List<Product> products { get; set; } 

    } 

    public class ItemsDeatails 
    { 
     public List<ItemsFromFile> ItemsFromFile { get; set; } 
    } 

    public class File 
    { 
     public string nameLocator { get; set; } 
     public ItemsDeatails itemsDeatails { get; set; } 
    } 

    public class RootObject 
    { 
     public string Token { get; set; } 
     public File file { get; set; } 
    } 

コントローラーコード:

if (type == "Salefreaks") 
       { 
      var token = ctx.BulkStores.FirstOrDefault(x => x.StoreName == store && x.Type == 1).Token; 

      var ItemsFromFile = new ItemsFromFile() 
        { 
         products = new List<Product>() 
        }; 

        var ItemsDeatails = new ItemsDeatails() 
        { 

        }; 

        var File = new File() 
        { 
         nameLocator = "testimport1" 
        }; 

        var RootObject = new RootObject() 
        { 
         Token = token 
        }; 

      var singleItems = ctx.BulkScannedItems.Where(x => x.UserSellerScanRequestId == id).ToList(); 

        foreach (var item in singleItems) 
        { 
         ItemsFromFile.products.Add(new Product { ASIN = item.ASIN, Title = item.EbayTitle }); 
        } 

        var json = new JavaScriptSerializer().Serialize(RootObject); 
     } 

必要なJSON出力コード:

{ 
    "Token": "7f3099b0-36b1", 
    "file": { 
    "nameLocator": "testimport1", 
    "itemsDeatails": { 
     "ItemsFromFile": [ 
     { 
     "ASIN": "B011KVFT9Y", 
     "Title": "Disney Batman Durable Party Beach Outdoor Adventure Camp Chair w/ Storage Bag" 
     }, 
     { 
     "ASIN": "B01D4KRBW2", 
     "Title": "High Quality Diy Oil Painting Paint Number Kit Theme-Romantic Street A Frameless" 
     } 
     ] 
    } 
    } 
} 
+0

私はあなたがルートオブジェクト上のファイルのプロパティを設定している...また、詳細オブジェクトに使用すると、Fileオブジェクトに詳細を割り当てていないように見える、またItemsFromFileことをどこにも表示されません。 – Trioj

+0

単純に 'Json'メソッドを使うことができます。 'return Json(rootObject);' – Shyju

答えて

1

、すべてのオブジェクトが適切に割り当てられていることを確認します。

var token = ctx.BulkStores.FirstOrDefault(x => x.StoreName == store && x.Type == 1).Token; 

var RootObject = new RootObject() { 
    Token = token, 
    file = new File() { 
     nameLocator = "testimport1", 
     itemsDeatails = new ItemsDeatails() { 
      ItemsFromFile = new List<ItemsFromFile>() 
     } 
    } 
}; 

var itemsFromFile = new ItemsFromFile(); 
itemsFromFile.products = new List<Product>(); 

var singleItems = ctx.BulkScannedItems.Where(x => x.UserSellerScanRequestId == id).ToList(); 

foreach (var item in singleItems) { 
    itemsFromFile.products.Add(new Product { ASIN = item.ASIN, Title = item.EbayTitle }); 
} 

RootObject.file.itemsDeatails.ItemsFromFile.Add(itemsFromFile); 

var json = new JavaScriptSerializer().Serialize(RootObject); 

つまり、ItemsFromFileクラスの内部にある商品のリストは必要ありません。この定義は、おそらくより理にかなって:

public class ItemsFromFile { 
    public string ASIN { get; set; } 
    public string Title { get; set; } 
} 

次に、あなたのコードはこのようなものになるだろう:あなたは同様に、コンストラクタのコードで内部オブジェクトを初期化することができます

var token = ctx.BulkStores.FirstOrDefault(x => x.StoreName == store && x.Type == 1).Token; 

var RootObject = new RootObject() { 
    Token = token, 
    file = new File() { 
     nameLocator = "testimport1", 
     itemsDeatails = new ItemsDeatails() { 
      ItemsFromFile = new List<ItemsFromFile>() 
     } 
    } 
}; 

var singleItems = ctx.BulkScannedItems.Where(x => x.UserSellerScanRequestId == id).ToList(); 

foreach (var item in singleItems) { 
    RootObject.file.itemsDeatails.ItemsFromFile.Add(new ItemsFromFile { ASIN = item.ASIN, Title = item.EbayTitle }); 
} 
1

public class RootObject 
    { 
     public string Token { get; set; } 
     public File file { get; set; } 
    } 

    public class File 
    { 
     public File() 
     { 
      this.itemsDeatails = new ItemsDeatails(); 
     } 
     public string nameLocator { get; set; } 
     public ItemsDeatails itemsDeatails { get; set; } 
    } 

    public class ItemsDeatails 
    { 
     public ItemsDeatails(){ 
     this.ItemsFromFile = new List<ItemsFromFile>(); 
     } 
     public List<ItemsFromFile> ItemsFromFile { get; set; } 
    } 

    public class ItemsFromFile 
    { 
     public ItemsFromFile(){ 
     this.products = new List<Product>(); 
     } 

     public List<Product> products { get; set; } 

    } 

    public class Product { 
     public string ASIN { get; set; } 
     public string Title { get; set; } 
    } 

アイテムを正しく初期化します。根本から根本的なオブジェクトを作成します。 内部クラスを最初から最後のクラスに移入します。

var itemDetails = new ItemsDeatails(); 

    itemDetails.ItemsFromFile = new ItemsFromFile(); 
    var singleItems = ctx.BulkScannedItems.Where(x => x.UserSellerScanRequestId == id).ToList(); 

    foreach (var item in singleItems) 
      { 
       itemDetails.ItemsFromFile.products.Add(new Product { ASIN = item.ASIN, Title = item.EbayTitle }); 
      } 

    var fl = new File(){ 
     nameLocator = "testimport1", 
     itemsDeatails = itemDetails 
    } 

    var token = ctx.BulkStores.FirstOrDefault(x => x.StoreName == store && x.Type == 1).Token; 

    var root = new RootObject() 
    { 
     Token = token, 
     file = fl 
    } 

    var json = new JavaScriptSerializer().Serialize(root); 
関連する問題