【问题标题】:JSON to CSV conversion using ChoETL Some array value missing使用 ChoETL 将 JSON 转换为 CSV 缺少一些数组值
【发布时间】:2020-01-01 11:40:06
【问题描述】:

我正在将 JSON 文件转换为 CSV 文件。 JSON 有多个嵌套对象和大尺寸。转换时,我能够将所有值从 JSON 中取出并放入 CSV。但是,缺少数组值。我正在使用 CHOETL 库。 示例 json 是(原始 json 长且大)

{
    "getUsers": [
        {
            "UserInformation": {
                "Id": 1111122,
                "firstName": "*****1",
                "UserType": {
                    "name": "CP"
                },
                "primaryState": "MA",
                "otherState": [
                    "MA",
                    "BA"
                ],
                "createdAt": null
            }
        },
        {
            "UserInformation": {
                "Id": 3333,
                "firstName": "*****3",
                "UserType": {
                    "name": "CPP"
                },
                "primaryState": "MPA",
                "otherState": [
                    "KL",
                    "TN",
                    "DL",
                    "AP",
                    "RJ"
                ],
                "createdAt": null
            }
        }
    ]
}

第一个数组中的otherState 数组是两个,但第二个数组是四个。它没有显示的是csv。 输入 json 是长且嵌套的层次结构,并且大多是动态的 代码是

StringBuilder msg = new StringBuilder();

            using (var w = new ChoCSVWriter(msg)
                .WithFirstLineHeader()
                )
            {
                using (var r = new ChoJSONReader(@"E:/Temp/CSV/input/Data_Sample2.json")
                    .WithJSONPath("$..getUsers[*]")
                    )
                {
                    w.Write(r);
                }
            }
            File

输出是

UserInformation_Id,UserInformation_firstName,UserInformation_UserType_name,UserInformation_primaryState,UserInformation_otherState_0,UserInformation_otherState_1,UserInformation_createdAt
1111122,*****1,CP,MA,MA,BA, 3333,*****3,CPP,MPA,KL,TN,

【问题讨论】:

标签: c# json choetl


【解决方案1】:

您必须提及 CSV 驱动程序才能使用 MaxScanRows 属性(默认为 1)自动扫描和发现字段

下面的示例代码显示了如何

StringBuilder csv = new StringBuilder();

using (var r = ChoJSONReader.LoadText(json)
    .WithJSONPath("$..getUsers[*]")
    )
{
    using (var w = new ChoCSVWriter(csv)
        .WithFirstLineHeader()
        .Configure(c => c.MaxScanRows = 2)
        .Configure(c => c.ThrowAndStopOnMissingField = false)
        )
    {
        w.Write(r);
    }
}

Console.WriteLine(csv.ToString());

【讨论】:

    【解决方案2】:

    我创建了一个文件 test.json 并将它放在 bin 目录中。 Test.json 与上面的内容相同。然后我使用了以下代码:

    using (var r = new ChoJSONReader("test.json"))
    {
       using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader())
       {
          w.Write(r);
       }
    }
    

    它生成了带有正确数组值的文件 sample.csv。你确定吗,stringbuilder msg 的内容是正确的。

    【讨论】:

    • 它得到输出,但我有两个用户,我希望每个用户都在单行中。根据您的代码,它仅显示在单行中。我的真实数据量大,单行很难
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2020-12-02
    • 2020-01-18
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多