C# 如何在没有循环的情况下将CSV字符串转换为json(或转换为c对象列表)?使用.NET Framework或.NET Core
语言:C# .NET Framework 4.7或.NET Core 我想知道有没有有效的方法将普通字符串转换为JSON(或C#对象列表)?下面是我的字符串:C# 如何在没有循环的情况下将CSV字符串转换为json(或转换为c对象列表)?使用.NET Framework或.NET Core,c#,.net,json,asp.net-core,C#,.net,Json,Asp.net Core,语言:C# .NET Framework 4.7或.NET Core 我想知道有没有有效的方法将普通字符串转换为JSON(或C#对象列表)?下面是我的字符串: "Product","Date","Expiry","Type","Price":"ABC","20-Jul-2019","20-Jul-2022","Supplemen
"Product","Date","Expiry","Type","Price":"ABC","20-Jul-2019","20-Jul-2022","Supplement","1300":"XYZ","20-Jul-2019","20-Jul-2022","Supplement","100":"AAA","20-Jul-2019","20-Jul-2022","Supplement","200":"XXX","20-Jul-2019","20-Jul-2022","Supplement","500"
如果您注意到,每一行都用冒号分隔(:
)
我可以通过像split(“:”)这样迭代每一行,然后创建DataTable,然后将其序列化为JSON来实现,但我想知道有没有有效的方法来避免循环并提高性能
更新 到目前为止,我已经通过使用下文实现了上述目标。它工作得很好,但我正在寻找某种方法来避免循环
private static DataTable createDataTable(string[] csvArray)
{
DataTable dtCSV = new DataTable();
int idx = 0;
foreach (var str in csvArray)
{
var valueArray = str.Split(',');
if (idx == 0)
{
for (int i = 0; i < valueArray.Length; i++)
{
dtCSV.Columns.Add(valueArray[i].Replace("\"", ""), typeof(String));
}
idx++;
}
else
{
DataRow dr;
dr = dtCSV.NewRow();
for (int i = 0; i < valueArray.Length; i++)
{
dr[i] = valueArray[i].Replace("\"","");
}
dtCSV.Rows.Add(dr);
}
}
return dtCSV;
}
使用JQuery将上述内容添加到锚定标记的href中。它以CSV格式导出数据。但我不想导出它,我想将它保存到数据库中。首先必须更正字符串。 类似于{“产品”:“ABC”,“日期”:“2019年7月20日”…} 然后
请先输入字符串而不是StringData,您必须更正字符串。 类似于{“产品”:“ABC”,“日期”:“2019年7月20日”…} 然后 把你的字符串而不是StringData放进去,这很简单 像这样: string str=“{\'name\':\'your name value\',\'age\':26}” var jv=JsonValue.Parse(str) 这很简单 像这样: string str=“{\'name\':\'your name value\',\'age\':26}”
var jv=JsonValue.Parse(str) 这可以使用LINQ和Json.Net完成(但仍将在内部执行循环):
这可以使用LINQ和Json.Net完成(但仍将在内部执行循环):
打字错误警报:补充-非“补充”(
e
-非i
-在l
之后)@Cid更新了问题。它工作正常,但我想避免循环,因为字符串可能非常大。您必须解析字符串。解析是通过逐字符检查字符来完成的,因此您将迭代每个字符。迭代是通过一种循环来完成的。避免循环就是避免解析就是避免完成作业。是否可以将“:”符号更改为数据中的换行符?如果是,您可以使用CsvHelper将其映射到具有几行的对象“到目前为止,我已经通过使用下面的代码实现了上面的功能。它工作正常,但我正在寻找某种方法来避免循环”这个问题可能适合而不是SOTypo alert:supplement-而不是“supplement”(e
-notI
-在l
之后)@Cid更新了问题。它工作正常,但我想避免循环,因为字符串可能非常大。您必须解析字符串。解析是通过逐字符检查字符来完成的,因此您将迭代每个字符。迭代是通过一种循环来完成的。避免循环就是避免解析就是避免完成作业。是否可以将“:”符号更改为数据中的换行符?如果是,您可以使用CsvHelper将其映射到具有几行的对象“到目前为止,我已通过使用下面的方法实现了上面的功能。它工作正常,但我正在寻找某种方法来避免循环”这个问题可能适合,而不是因为它很简单,但我的字符串不是上面的格式。这真是一条普通的线。我已经用当前的实现更新了这个问题。它很简单,但我的字符串不是上面的格式。这真是一条普通的线。我已经用当前的实现更新了这个问题。它很简单,但我的字符串不是上面的格式。这真是一条普通的线。我已经用当前的实现更新了这个问题。它很简单,但我的字符串不是上面的格式。这真是一条普通的线。我已经用当前的实现更新了这个问题。是的,它将在内部使用循环,但看起来很干净。谢天谢地,它将在内部使用循环,但看起来很干净。谢谢
var csv = 'data:application/csv;charset=utf-8,' + encodeURIComponent(myString);
return Json(new
{
data = "YourStringData",
});
using Newtonsoft.Json;
using System.Linq;
// -----------
var data = "\"Product\",\"Date\",\"Expiry\",\"Type\",\"Price\":\"ABC\",\"20-Jul-2019\",\"20-Jul-2022\",\"Supplement\",\"1300\":\"XYZ\",\"20-Jul-2019\",\"20-Jul-2022\",\"Supplement\",\"100\":\"AAA\",\"20-Jul-2019\",\"20-Jul-2022\",\"Supplement\",\"200\":\"XXX\",\"20-Jul-2019\",\"20-Jul-2022\",\"Supplement\",\"500\"";
var datas = data.Split(':'); // string[] containing each line of the CSV
var MemberNames = datas[0].Split(','); // the first line, that contains the member names
var MYObj = datas.Skip(1) // don't take the first line (member names)
.Select((x) => x.Split(',') // split columns
/*
* create an anonymous collection
* with object having 2 properties Key and Value
* (and removes the unneeded ")
*/
.Select((y, i) => new { Key = MemberNames[i].Trim('"'),
Value = y.Trim('"') })
// convert it to a Dictionary
.ToDictionary(d => d.Key, d => d.Value));
// MYObject is IEnumerable<Dictionary<string, string>>
// serialize (remove indented if needed)
var Json = JsonConvert.SerializeObject(MYObj, Formatting.Indented);
Debug.WriteLine(Json);
[
{
"Product": "ABC",
"Date": "20-Jul-2019",
"Expiry": "20-Jul-2022",
"Type": "Supplement",
"Price": "1300"
},
{
"Product": "XYZ",
"Date": "20-Jul-2019",
"Expiry": "20-Jul-2022",
"Type": "Supplement",
"Price": "100"
},
{
"Product": "AAA",
"Date": "20-Jul-2019",
"Expiry": "20-Jul-2022",
"Type": "Supplement",
"Price": "200"
},
{
"Product": "XXX",
"Date": "20-Jul-2019",
"Expiry": "20-Jul-2022",
"Type": "Supplement",
"Price": "500"
}
]