【问题标题】:In CsvHelper, how do you convert fields of type List<string> to Json?在 CsvHelper 中,如何将 List<string> 类型的字段转换为 Json?
【发布时间】:2021-02-19 01:07:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# csvhelper


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 1970-01-01
      • 2015-06-05
      • 2016-09-27
      • 2013-08-26
      • 1970-01-01
      • 2018-10-06
      • 2022-01-05
      • 2020-01-11
      相关资源
      最近更新 更多