我需要在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”。
但我需要在我的应用程序中进行此操作,而不使用外部框架。
我该如何使其发挥作用?
答案 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());
}