You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ChoETL将复杂JSON转CSV时数据缺失问题求助

解决ChoETL转换JSON到CSV时数组与单个值类型不一致导致数据丢失的问题

问题说明

使用ChoETL处理JSON转CSV时,extension数组内的对象存在类型不一致情况:第一个对象的value是数组,后续对象的value是单个字符串,导致单个值(如20、35)被忽略,无法生成预期的CSV结构。

现有代码

StringBuilder csv = new StringBuilder();

using (var r = new ChoJSONReader(FileNameSample33JSON)
                      .WithJSONPath("$..getUsers[*]", true))
{
    using (var w = new ChoCSVWriter(csv)
                          .WithFirstLineHeader()
                          .WithMaxScanRows(10)
                          .Configure(c => c.ThrowAndStopOnMissingField = false))
    w.Write(r);
}

目标JSON片段

"extension": [
    {
        "Test": "value",
        "value": [ "0", "1", "2" ]
    },
    {
        "Test1": "Test",
        "value": "20"
    },
    {
        "Test2": "Test",
        "value": "35"
    }
]

期望CSV输出

extension_0_value_0extension_0_value_1extension_0_value_2extension_1_valueextension_2_value
0122035

解决方案

核心思路是统一value字段的类型,将单个值包装为数组,让ChoETL能识别所有字段并正确输出。

方案1:自定义值转换器(推荐)

通过转换器将所有extension对象的value统一转为数组类型,确保扫描规则一致:

StringBuilder csv = new StringBuilder();

using (var r = new ChoJSONReader(FileNameSample33JSON)
                      .WithJSONPath("$..getUsers[*]", true)
                      // 为所有extension内的value字段添加类型转换
                      .ConfigureField("extension[*].value", cfg => 
                      {
                          cfg.ValueConverter = o => 
                          {
                              // 单个字符串转为单元素数组,数组则直接返回
                              return o is string singleValue ? new[] { singleValue } : o;
                          };
                      }))
{
    using (var w = new ChoCSVWriter(csv)
                          .WithFirstLineHeader()
                          .WithMaxScanRows(10)
                          .Configure(c => c.ThrowAndStopOnMissingField = false))
    {
        w.Write(r);
    }
}

方案2:显式声明字段类型

逐个指定extension元素的value字段类型为数组,强制ChoETL按数组规则读取:

StringBuilder csv = new StringBuilder();

using (var r = new ChoJSONReader(FileNameSample33JSON)
                      .WithJSONPath("$..getUsers[*]", true)
                      .WithField("extension_0_value", jsonPath: "$.extension[0].value", fieldType: typeof(string[]))
                      .WithField("extension_1_value", jsonPath: "$.extension[1].value", fieldType: typeof(string[]))
                      .WithField("extension_2_value", jsonPath: "$.extension[2].value", fieldType: typeof(string[])))
{
    using (var w = new ChoCSVWriter(csv)
                          .WithFirstLineHeader()
                          .WithMaxScanRows(10)
                          .Configure(c => c.ThrowAndStopOnMissingField = false))
    {
        w.Write(r);
    }
}

内容的提问来源于stack exchange,提问作者Karthigeyan P R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:57:42