[英]C# Convert Json to CSV
我有以下格式的json文件:
{
"HDRDTL":["SRNO","STK_IDN","CERTIMG"],
"PKTDTL":[
{"SRNO":"2814","STK_IDN":"1001101259","CERTIMG":"6262941723"},
{"SRNO":"2815","STK_IDN":"1001101269","CERTIMG":"6262941726"},
{"SRNO":"2816","STK_IDN":"1001101279","CERTIMG":"6262941729"}
],
"IMGTTL":
["CERTIMG","ARRIMG"],
"IMGDTL":{"CERTIMG":"CRd6z2uq3gvx7kk","ARRIMG":"ASd6z2uq3gvx7kk"}
}
“ PKTDTL”數組是我需要轉換為csv的部分。 如何在C#中實現呢?
請注意,作為示例,我在“ PKTDTL”中只有3個項目,真正的json文件具有成千上萬的({“ SRNO” ...})行,並且很大。
我寫了下面的代碼不起作用。 請參閱代碼中注釋的錯誤消息。
題
你有更好的/替代方法
public static void ConvertJsonToCSV(string InFile) { string OutFile=InFile.Replace("json","csv"); StreamReader sInFile = new StreamReader(InFile); StreamWriter sOutFile = new StreamWriter(OutFile); using (sInFile) { string sJson = sInFile.ReadToEnd(); //************************************************************* // the below line failed, error message: unexpected json token // when reading datatable, expected startArray, got StartObject. //************************************************************** DataTable dt = JsonConvert.DeserializeObject<DataTable>(sJson); //DataTable dt = JsonConvert.DeserializeAnonymousType(sJson, new { Makes = default(DataTable) }).Makes; var sb = new StringBuilder(); string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); sb.AppendLine(string.Join(",", columnNames)); foreach (DataRow dr in dt.Rows) { foreach (object field in dr.ItemArray) { sb.Append(field.ToString().Replace(",", "") + ","); } sb.Replace(",", "\\n", sb.Length - 1, 1); } sOutFile.Write(sb.ToString()); sOutFile.Close(); sInFile.Close(); }
}
我發現自己處於類似情況。 這就是我所做的。 首先,我創建了一個JObject(使用Newtonsoft.Json.Linq),讓我們考慮到您的json位於名為“ strJSON”的字符串變量中。
JObject jsonObj= JObject.parse(strJSON);
JObject PKTDL=jsonObj["PKTDTL"] as JObject;
IList<string> keys = PKTDL.Properties().Select(p => p.Name).ToList(); // this gives column names
StringBuilder sb=new StringBuilder();
string headers="";
foreach(string key in keys)
{
headers+=","+key;
}
sb.AppendLine(headers.TrimStart(','));
foreach(JObject j in jsonObj["PKTDTL"]) //if jobject doesnt work try "JToken j"
{
string values="";
foreach(string key in keys)
{
values+=","+jsonObj["PKTDTL"][key];
}
sb.AppendLine(values.TrimStart(','));
}
File.WriteAllText(filePath, sb.ToString());
然后將某人另存為csv
使用Cinchoo ETL-一個開源庫,您只需幾行代碼即可輕松完成轉換
string json = @"{
""HDRDTL"":[""SRNO"",""STK_IDN"",""CERTIMG""],
""PKTDTL"":[
{""SRNO"":""2814"",""STK_IDN"":""1001101259"",""CERTIMG"":""6262941723""},
{""SRNO"":""2815"",""STK_IDN"":""1001101269"",""CERTIMG"":""6262941726""},
{""SRNO"":""2816"",""STK_IDN"":""1001101279"",""CERTIMG"":""6262941729""}
],
""IMGTTL"":
[""CERTIMG"",""ARRIMG""],
""IMGDTL"":{""CERTIMG"":""CRd6z2uq3gvx7kk"",""ARRIMG"":""ASd6z2uq3gvx7kk""}
}";
StringBuilder sb = new StringBuilder();
using (var p = ChoJSONReader.LoadText(json).WithJSONPath("$..PKTDTL")
)
{
using (var w = new ChoCSVWriter(sb)
.WithFirstLineHeader()
)
w.Write(p);
}
Console.WriteLine(sb.ToString());
輸出:
SRNO,STK_IDN,CERTIMG
2814,1001101259,6262941723
2815,1001101269,6262941726
2816,1001101279,6262941729
查閱CodeProject文章以獲取其他幫助。
免責聲明:我是這個圖書館的作者。
復制類似的問題(請參見JsonToCsv(string,string)方法)。 如果您已經在使用NewtonSoft Json.NET和CsvHelper ,則可以在ExpandoObject的幫助下進行類似的轉換。
var jsonText = @"{
""HDRDTL"":[""SRNO"",""STK_IDN"",""CERTIMG""],
""PKTDTL"":[
{""SRNO"":""2814"",""STK_IDN"":""1001101259"",""CERTIMG"":""6262941723""},
{""SRNO"":""2815"",""STK_IDN"":""1001101269"",""CERTIMG"":""6262941726""},
{""SRNO"":""2816"",""STK_IDN"":""1001101279"",""CERTIMG"":""6262941729""}
],
""IMGTTL"":
[""CERTIMG"",""ARRIMG""],
""IMGDTL"":{""CERTIMG"":""CRd6z2uq3gvx7kk"",""ARRIMG"":""ASd6z2uq3gvx7kk""}
}";
var jtoken = JObject.Parse(jsonText).SelectToken("$..PKTDTL");
var expandos = jtoken.ToObject<ExpandoObject[]>();
string csvText;
using (var writer = new StringWriter())
{
using (var csv = new CsvWriter(writer))
{
csv.WriteRecords(expandos as IEnumerable<dynamic>);
}
csvText = writer.ToString();
}
Console.WriteLine(csvText);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.