2017-10-09 187 views
4

我需要在JSON对象中转换CSV数据(包含一行标题和一行数据)。 的CSV包含嵌套列,有一个例子:将CSV(嵌套对象)转换为JSON

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

而且我希望有一个JSON看起来像这样:

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

我试过CsvHelper和ChoETL库,都没有成功,因为这些就我所知,libs要求我有一个类作为模型,但我没有这些类,因为数据是完全动态的。

该网站http://www.convertcsv.com/csv-to-json.htm是一个成功的例子。 只需粘贴上面创建的JSON,转到步骤3并选中'Recreate nested objects and arrays'选项,然后在步骤5中单击'CSV to JSON'。

但是我需要在我的应用程序,而不使用外部框架。

我该如何使这个工作?

+2

如果数据是完全动态的并且您没有合理的结构期望,您可以期望将未知变成已知结构吗? – maccettura

+1

其中之一,你可以尝试建立一个字典Dictionary ,其中key是属性的名称,值可以是嵌套对象的值或另一个字典。棘手的部分是决定值是字符串还是整数。稍后,您可以用JSON.Net序列化它,而不需要太多努力。 – orhtej2

回答

2

如果没有它,添加newtonsoft库(DLL),然后添加如下因素引用

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

然后使用此代码

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

随着最新ChoETL.JSON 1.0.1.6,您可以将其轻松转换。这只有在标题是简单文本,不允许有空格或特殊字符的情况下才有效。

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