Впервые до 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);
}