首页 > 解决方案 > 在 CsvHelper 中,如何转换 List 类型的字段到杰​​森?

问题描述

假设您有想要写入 csv 的数据结构(以及可能具有相同类型字段的其他数据结构):

public class Foo
{
    public Dictionary<string, string> Properties { get; set; }
    public List<string> Tags { get; set; }
}

你如何让 CsvHelper 将这些类型转换为 Json 字符串?(不写几个类图)

[注意:我自己拼凑了一个解决方案,但想在这里分享]

标签: c#csvhelper

解决方案


您将编写一些辅助方法来读取和写入您的 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/


推荐阅读