json в CSV: C# - PullRequest
       60

json в CSV: C#

0 голосов
/ 03 мая 2020

Впервые до C# и, надеюсь, есть простое решение для этого. Использование пакетов Newtonsoft и CsvHelper для преобразования json в файл csv. Я не имею никакого контроля над вводом json. Итак, вход json может иметь 'attr4' 'attr5' и так далее (или без 'attr1' ..). в приведенном ниже коде раздел, использующий foreach, работает должным образом.

Я надеюсь избежать foreach во втором разделе (написание mycsv2.csv), но это не работает.

Я новичок во всем этом, и я надеюсь, что это простая ошибка.

    public static void jsonToCsv()
    {
        string json = @"{
                'attr1': 'val1',
                'attr2': 'val2',
                'attr3': 'val3'                      
            }";

        //working
        var records = new List<object> {};
        JObject jObj = JObject.Parse(json);
        dynamic obj = new ExpandoObject();

        foreach (JProperty property in jObj.Properties())
        {
            AddProperty(obj, property.Name, property.Value.ToString());
        }
        records.Add(obj);                    

        using (var writer = new StreamWriter("C:\\csv\\mycsv1.csv"))
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(records);
        }

        //NOT working

        var recordsD = new List<object> {};
        JObject jObjD = JObject.Parse(json);
        dynamic objD = new ExpandoObject();
        objD = jObjD.ToObject<object>();            
        records.Add(objD);

        using (var writer = new StreamWriter("C:\\csv\\mycsv2.csv"))
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(recordsD);
        }

    }

    public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
    {
        // ExpandoObject supports IDictionary so we can extend it like this
        var expandoDict = expando as IDictionary<string, object>;
        if (expandoDict.ContainsKey(propertyName))
            expandoDict[propertyName] = propertyValue;
        else
            expandoDict.Add(propertyName, propertyValue);
    }

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете привести к ExpandoObject, а не Object во втором запросе, как в следующем коде:

var recordsD = new List<object> { };
JObject jObjD = JObject.Parse(json);
dynamic objD = new ExpandoObject();

objD = jObjD.ToObject<ExpandoObject>();
recordsD.Add(objD);

Это даст тот же результат, что и первый запрос.

Я надеюсь это поможет вам решить проблему.

0 голосов
/ 08 мая 2020

В качестве альтернативы вы можете использовать Cinchoo ETL , чтобы выполнить преобразование JSON в CSV, как показано ниже (не требуется указывать конфигурацию / схему для анализа переменных файлов)

Установить пакет nuget

ChoetL пакета установки. JSON

string json = @"{
    'attr1': 'val1',
    'attr2': 'val2',
    'attr3': 'val3'                      
}";

StringBuilder csv = new StringBuilder();
using (var r = ChoJSONReader.LoadText(json))
{
    using (var w = new ChoCSVWriter(csv)
        .WithFirstLineHeader()
        )
        w.Write(r);
}

Console.WriteLine(csv.ToString());

Вывод:

attr1,attr2,attr3
val1,val2,val3

Надеюсь, это поможет.

...