C # Конвертировать Json в CSV - PullRequest
0 голосов
/ 14 мая 2018

У меня есть файл 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 #?

Обратите внимание, в качестве примера, у меня есть только 3 элемента в "PKTDTL", настоящий файл 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();
    }
    

    }

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

С 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 для получения дополнительной помощи.

Отказ от ответственности: я являюсь автором этой библиотеки.

0 голосов
/ 14 мая 2018

Я оказался в похожей ситуации. это то, что я сделал. Сначала я создал 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());

затем сохраните sb как csv

...