在CsvHelper中,如何将List<string>类型的字段转换为Json类型的字段?

In CsvHelper, how do you convert fields of type List<string> to Json?

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

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

如何让 CsvHelper 将这些类型转换为 Json 字符串? (没有写几个 class 地图)

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

您可以编写一些辅助方法来读取和写入您的 csv,但是在您将方法调用到 read/write 之前,您需要这样做(使用 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);
}

你需要添加这个class(这是我从官方文档中找到的):

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);
    }
}

参考文献:

https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/type-conversion/