c# - json 到 csv:C#
问题描述
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);
}
解决方案
您可以在第二个查询中强制转换为ExpandoObject
not Object
,如以下代码:
var recordsD = new List<object> { };
JObject jObjD = JObject.Parse(json);
dynamic objD = new ExpandoObject();
objD = jObjD.ToObject<ExpandoObject>();
recordsD.Add(objD);
这给出了与第一个请求相同的结果。
我希望这可以帮助您解决问题。
推荐阅读
- docker - 有没有办法告诉 docker 镜像中的 shell 命令可用?
- android - 如何在 Jetpack Compose 中为惰性行的每个项目单独延迟可绘制动画矢量的动画
- reactjs - 使用 Hooks API:React 是否尊重 setState 顺序?
- javascript - 生成对象引用的哈希字符串
- java - 在没有DelayedMessage插件或停止线程的Java中延迟消息到RabbitMQ
- javascript - 使用 react-router-dom 在 Route 中添加组件作为道具
- c - Makefile 尝试编译它自己的规则之一,就好像它是一个文件一样
- laravel - 将 PSQL 表达式转换为 Laravel Eloquent Builder 表达式
- mysql - 将 MySQL 中最后插入的项目的 ID 发送到前端。(Express.js)
- excel - Excel VBE 取消隐藏模块代码不再可见