如何使用 ChoETL 将 JSON 数组输出为 CSV 中的单个字段

How to output JSON array as a single field in CSV using ChoETL

我正在使用 ChoETL 将 JSON 转换为 CSV。目前,如果 JSON 对象中的 属性 是一个数组,它会输出到 JSON 中的单独字段中。 示例:

{
    "id", 1234,
    "states": [
        "PA",
        "VA"
     ]
},
{
    "id", 1235,
    "states": [
        "CA",
        "DE",
        "MD"
     ]
},

这会产生这样的 CSV(使用管道作为分隔符)

"id"|"states_0"|"states_1"|"states_2"
"1234"|"PA"|"VA"
"1235"|"CA"|"DE"|"MD"

我希望数组以逗号分隔的字符串形式显示在单个状态字段中

"id"|"states"
"1234"|"PA,VA"
"1235"|"CA,DE,MD"

这是我执行解析和转换的代码。

public static class JsonCsvConverter
{
    public static string ConvertJsonToCsv(string json)
    {
        var csvData = new StringBuilder();
        using (var jsonReader = ChoJSONReader.LoadText(json))
        {
            using (var csvWriter = new ChoCSVWriter(csvData).WithFirstLineHeader())
            {
                csvWriter.WithMaxScanRows(1000);
                csvWriter.Configuration.Delimiter = "|";
                csvWriter.Configuration.QuoteAllFields = true;
                csvWriter.Write(jsonReader);
            }
        }

        return csvData.ToString();
    }
}

已编辑:删除了无用的测试代码

这是使用以下代码生成预期输出的方法

var csvData = new StringBuilder();
using (var jsonReader = ChoJSONReader.LoadText(json))
{
    using (var csvWriter = new ChoCSVWriter(csvData)
        .WithFirstLineHeader()
        .WithDelimiter("|")
        .QuoteAllFields()
        .Configure(c => c.UseNestedKeyFormat = false)
        .WithField("id")
        .WithField("states",  m => m.ValueConverter(o => String.Join(",", ((Array)o).OfType<string>())))
        )
    {
        csvWriter.Write(jsonReader);
    }
}

Console.WriteLine(csvData.ToString());

输出:

id|states
"1234"|"PA,VA"
"1235"|"CA,DE,MD"

PS: 在下一个版本中,这个问题将在不使用 valueconverters

的情况下自动处理