【问题标题】:Csv stream to JSON conversion using ChoETL.Json failing使用 ChoETL.Json 将 Csv 流转换为 JSON 失败
【发布时间】:2020-05-06 15:11:27
【问题描述】:

在我的应用程序中,我正在获取 csv 流,并且我正在尝试将 Csv 流动态转换为 JSON JToken,在这里我将不知道 CSV 中的列,因此无法定义映射。 要将此流转换为 JSON,我正在使用 ChoETL.Json CsvReader 但这无法转换为某些值,因为它将字符串视为 DatTime 类型 这是为复制问题而创建的示例函数

public static void ConvertCsvStream()
        {
            JToken result = null;
            string delemeter = ",";
            string csvText = "\"Invoice Number\"\n\"1583-03\"\n\"1589-00\"";
            try
            {
                Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(csvText));
                using (StreamReader reader = new StreamReader(stream))
                {
                    using (var csv = new ChoCSVReader(reader).WithFirstLineHeader().WithDelimiter(delemeter))
                    {
                        result = JToken.FromObject(csv);
                    }
                }
            }
            catch(Exception ex)
            {

            }


        //return JToken.FromObject(sb.ToString());
    }

这是抛出错误

Can't convert '1589-00' value from 'System.String' type to 'System.DateTime' type

对于某些值,它可以转换但将值视为日期时间

{[{"Invoice Number": "1583-02-01T00:00:00"}, {"Invoice Number": "1583-03-01T00:00:00"}]}

有人可以帮忙吗?我将无法为 csv 创建模型,因为我不知道列

编辑

将包升级到新版本后,我能够创建一种将 csv 流转换为 JToken 的方法

public static JToken ConvertCsvStream(Stream stream,string delemeter)
        {
            if (string.IsNullOrWhiteSpace(delemeter))
                delemeter = ",";

            using (StreamReader reader = new StreamReader(stream))
            {
                using (var csv=new ChoCSVReader(stream).QuoteAllFields().WithFirstLineHeader().WithDelimiter(delemeter))
                {
                    return JToken.FromObject(csv);
                }
            }
        }

【问题讨论】:

    标签: c# json .net-core json.net choetl


    【解决方案1】:

    这是库中的一个错误,使用自动类型发现将“1583-03”视为日期时间。请使用最新的 (1.2.0.1) nuget 包进行修复。

    这是工作示例

    string csvText = "\"Invoice Number\"\n\"1583-03\"\n\"1589-00\"";
    
    StringBuilder json = new StringBuilder();
    using (var r = ChoCSVReader.LoadText(csvText)
        .WithFirstLineHeader()
        .QuoteAllFields()
        )
    {
        using (var w = new ChoJSONWriter(json))
            w.Write(r);
    }
    Console.WriteLine(json.ToString());
    

    输出:

    [
     {
      "Invoice Number": "1583-03"
     },
     {
      "Invoice Number": "1589-00"
     }
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2018-01-04
      • 2021-08-29
      • 2023-04-02
      相关资源
      最近更新 更多