2017-10-09 50 views
4

JSONオブジェクトでCSVデータ(ヘッダーの1行と1行のデータ)を変換する必要があります。 CSVは、ネストされた列が含まれ、例があります:CSV(ネストされたオブジェクト)をJSONに変換

id,name,category/id,category/name,category/subcategory/id,category/subcategory/name,description 
0,Test123,15,Cat123,10,SubCat123,Desc123 

そして私はJSONは次のようになりたい:これらのことから、私は成功せず、CsvHelperとChoETL LIBSを試してみた

{ 
    "id": 0, 
    "name": "Test123", 
    "category": { 
     "id": 15, 
     "name": "Cat123", 
     "subcategory": { 
      "id": 10, 
      "name": "SubCat123", 
     } 
    }, 
    "description": "Desc123" 
} 

私が知る限り、libsはモデルとしてクラスを持つ必要がありますが、データは完全に動的なので、これらのクラスはありません。

サイトhttp://www.convertcsv.com/csv-to-json.htmはこれを成功させるための良い例です。 上記で作成したJSONを貼り付け、ステップ3に進み、[入れ子オブジェクトと配列を再作成する]オプションをオンにして、ステップ5で[CSV to JSON]をクリックします。

しかし、アプリケーション、外部フレームワークを使用せずに。

これを動作させるにはどうすればよいですか?あなたはそれを持っていない場合

+2

データが完全に動的で構造が妥当でない場合は、未知の構造を既知の構造にすることが期待できますか? – maccettura

+1

1つは、Dictionary ディクショナリを構築してみてください。ここで、keyはプロパティの名前であり、値はwell ...入れ子オブジェクトの値または別の辞書です。トリッキーな部分は、値が文字列かintかを決定します。後で、JSON.Netを使用して多大な労力をかけずにシリアル化することができます。 – orhtej2

答えて

2

、folowing参照

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

次のクラス

public class Rootobject 
     { 
      public int id { get; set; } 
      public string name { get; set; } 
      public Category category { get; set; } 
      public string description { get; set; } 
     } 

     public class Category 
     { 
      public int id { get; set; } 
      public string name { get; set; } 
      public Subcategory subcategory { get; set; } 
     } 

     public class Subcategory 
     { 
      public int id { get; set; } 
      public string name { get; set; } 
     } 

追加追加しnewtonsoftライブラリ(DLL)を追加し、 このコードを使用最新ChoETL.JSON 1.0.1.6で

DataTable CSVData = new DataTable(); // your csv rows 



      HashSet<Rootobject> MyObjectsList = new HashSet<Rootobject>(); //create hashset to handle your classes 
      foreach(DataRow row in CSVData.Rows) 
      { 
       //change the indices in ItemArray with the right indices 
       MyObjectsList.Add(new Rootobject() { 
        id = (int)row.ItemArray[0], name = (string)row.ItemArray[0], category = new Category() { 
         id = (int)row.ItemArray[0], name = (string)row.ItemArray[0], subcategory = new Subcategory() { 
          id = (int)row.ItemArray[0], name = (string)row.ItemArray[0] 
         } 
        } 
       }); 


      } 





      string _ResultObj = JsonConvert.SerializeObject(MyObjectsList); //here get your json string 
0

、あなたは簡単にそれらを変換することができます。これは、ヘッダーが単純なテキストで、スペースや特殊文字が許可されていない場合にのみ機能します。

using (var json = new ChoJSONWriter("nested.json")) 
{ 
    using (var csv = new ChoCSVReader("nested.csv").WithFirstLineHeader()) 
     json.Write(csv.Select(i => i.ConvertToNestedObject('_'))); 
} 

JSONを見ていきます出力以下

[ 
{ 
    "id":0, 
    "name":"Test123", 
    "category": { 
    "id": 15, 
    "name": "Cat123", 
    "subcategory": { 
     "id": 10, 
     "name": "SubCat123" 
    } 
    }, 
    "description":"Desc123" 
} 
] 

UPDATE:

Cinchoo ETLが今だけ 'NestedColumnSeparator' 設定パラメータを設定することにより、ネイティブネストされたオブジェクトのサポートをサポートしてい に '/' 。下のサンプルは、どのように表示するか

using (var csv = new ChoCSVReader("nested.csv").WithFirstLineHeader() 
    .Configure(c => c.NestedColumnSeparator = '/') 
    ) 
{ 
    foreach (var x in csv) 
     Console.WriteLine(x.DumpAsJson()); 
} 
関連する問題