刚接触C#,希望有一个简单的解决方法。使用Newtonsoft和CsvHelper包将json转换为csv文件。我对输入的json没有任何控制,所以,输入的json可以有'attr4''attr5'等等(或者没有'attr1'......).在下面的代码中,使用foreach的部分按预期工作。
我希望在第二部分(mycsv2.csv的编写)避免使用foreach,但这是行不通的。
我是新来的,希望这是一个简单的错误。
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);
}
你可以将其转换为 "attr4"。ExpandoObject
不 Object
在第二个查询中,像下面的代码。
var recordsD = new List<object> { };
JObject jObjD = JObject.Parse(json);
dynamic objD = new ExpandoObject();
objD = jObjD.ToObject<ExpandoObject>();
recordsD.Add(objD);
这样做的结果和第一个请求一样
我希望这能帮助你解决这个问题。
或者你也可以使用 Cinchoo ETL 将JSON转换为CSV,如下图所示(无需定义配置模式来解析变量文件)
安装nuget包
Install-Package 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
希望能帮到你