将CSV(嵌套对象)转换为JSON

时间:2017-10-09 20:27:12

标签: c# json csv

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

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库,但没有成功,因为据我所知,这些库要求我有一个类作为模型,但我没有这些类,因为数据是完全动态的。

网站http://www.convertcsv.com/csv-to-json.htm是成功实现这一目标的一个很好的例子。 只需粘贴我上面创建的JSON,转到步骤3并选中“重新创建嵌套对象和数组”选项,然后在步骤5中单击“CSV to JSON”。

但我需要在我的应用程序中进行此操作,而不使用外部框架。

我该如何使其发挥作用?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"
 }
]

<强>更新

Cinchoo ETL现在支持原生嵌套对象支持,只需设置&#39; NestedColumnSeparator&#39;配置参数为&#39; /&#39;。以下示例显示了如何

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