c# - 在 CsvHelper 中,如何转换 List 类型的字段到杰森?
问题描述
假设您有想要写入 csv 的数据结构(以及可能具有相同类型字段的其他数据结构):
public class Foo
{
public Dictionary<string, string> Properties { get; set; }
public List<string> Tags { get; set; }
}
你如何让 CsvHelper 将这些类型转换为 Json 字符串?(不写几个类图)
[注意:我自己拼凑了一个解决方案,但想在这里分享]
解决方案
您将编写一些辅助方法来读取和写入您的 csv,但在调用该方法进行读取/写入之前,您需要执行此操作(使用 nuget 包的 v23.0.0 进行测试):
csv.Context.TypeConverterCache.AddConverter<List<string>>(new JsonConverter<List<string>>());
csv.Context.TypeConverterCache.AddConverter<Dictionary<string,string>>(new JsonConverter<Dictionary<string,string>>());
下面是编写记录的辅助方法示例:
using (var writer = new StreamWriter(outfile, true))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.TypeConverterCache.AddConverter<List<string>>(new JsonConverter<List<string>>());
csv.Context.TypeConverterCache.AddConverter<Dictionary<string,string>>(new JsonConverter<Dictionary<string,string>>());
csv.WriteRecords(yourRecords);
}
你需要添加这个类(我从官方文档中找到的):
public class JsonConverter<T> : ITypeConverter
{
public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
return JsonConvert.DeserializeObject<T>(text);
}
public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
return JsonConvert.SerializeObject(value);
}
}
参考:
CsvHelper 设置默认自定义 TypeConverter
https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/type-conversion/
推荐阅读
- spring - Spring Boot 应用程序之间的 Jaeger 中未显示服务依赖项
- sql - 计算同一查询中的不同组
- react-native - react-native-signature-canvas 在 expo IOS 中无法正常工作
- android - 如何使用 Firebase Cloud Messaging 发送图像并使用数据有效负载发出通知
- python-3.x - 在 python 3 中使用 pandas 读取 sql 查询时出现问题
- python - 访问嵌套函数中的外部函数参数会产生奇怪的行为?
- sql - 为什么括号在此sql查询中有所不同
- wordpress - 在 WooCommerce 中输出订阅号以用作会员号
- dart - 如何在 Flutter 中挂载的小部件中设置状态?
- javascript - 如何处理 Ramda 中的错误