簡體   English   中英

C#將Json轉換為CSV

[英]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.NETCsvHelper ,則可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM