Langage: C #
.NET Framework 4.7 ou .NET Core
Je veux savoir s'il existe un moyen efficace de convertir une chaîne simple en JSON (ou en liste d'objets C #)? Voici ma chaîne:
var csv = 'data:application/csv;charset=utf-8,' + encodeURIComponent(myString);
Si vous remarquez, chaque ligne est séparée par deux-points (:
).
Je peux faites-le en itérant chaque ligne comme split (':') puis créez DataTable puis sérialisez-le en JSON mais je veux savoir y a-t-il un moyen efficace d'éviter les boucles et d'améliorer les performances?
Mettre à jour Jusqu'à présent, j'ai réalisé ci-dessus en utilisant ci-dessous. Cela fonctionne bien, mais je cherche un moyen d'éviter les boucles.
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; }
Je me demande simplement, nous pouvons convertir la chaîne en csv en utilisant le href de la balise d'ancrage en utilisant le code ci-dessous, c'est il existe un moyen d'obtenir des résultats similaires côté serveur C #. Une fois qu'il est converti en CSV, il est également facile de l'enregistrer dans la table de base de données.
"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"
ajouter ci-dessus à href de la balise d'ancrage en utilisant JQuery. Il exporte les données au format CSV. Mais je ne veux pas l'exporter, je veux l'enregistrer dans la base de données.
3 Réponses :
Vous devez d'abord corriger votre chaîne. Quelque chose comme {"Product": "ABC", "Date": "20-Jul-2019", ...}
puis
return Json(new { data = "YourStringData", });
mettez votre chaîne à la place de YourStringData
C'est simple mais ma chaîne n'est pas au format ci-dessus. C'est vraiment une corde simple. J'ai mis à jour la question avec la mise en œuvre actuelle.
C'est très simple comme ceci:
string str = "{\" name \ ": \" votre nom valeur \ ", \" age \ ": 26}";
var jv = JsonValue.Parse (str);
C'est simple mais ma chaîne n'est pas au format ci-dessus. C'est vraiment une corde simple. J'ai mis à jour la question avec la mise en œuvre actuelle.
Cela peut être fait en utilisant LINQ et Json.Net (mais fera toujours des boucles en interne):
[ { "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" } ]
Ceci génère:
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);
p>
oui, il utilisera des boucles en interne mais semble une approche propre. Merci
Alerte Typo : supplément - pas "suppliment" (
e
- pasi
- après lel < / code>)
@Cid a mis à jour la question. Cela fonctionne bien mais je veux éviter les boucles car la corde peut être vraiment grosse.
Vous devez analyser la chaîne. L'analyse se fait en examinant char pour char afin que vous itériez sur chaque caractère. L'itération se fait par une sorte de boucle. Éviter les boucles, c'est éviter l'analyse, c'est éviter de faire le travail.
Pouvez-vous remplacer le symbole «:» par une nouvelle ligne dans vos données? Si oui, vous pouvez utiliser CsvHelper pour le mapper à des objets avec quelques lignes
@astef Je le recommanderais aussi, mais OP n'aime pas les boucles, mais je parie que CsvHelper utilise des boucles en interne.
"Jusqu'à présent, j'ai réalisé ci-dessus en utilisant ci-dessous. Cela fonctionne bien, mais je cherche un moyen d'éviter les boucles" Cette question peut convient codereview plutôt que SO