【问题标题】:Convert CSV file to JArray将 CSV 文件转换为 JArray
【发布时间】:2022-02-01 02:51:11
【问题描述】:

我需要将 Invoke-WebRequest 调用的 json 结果导出到 .CSV 文件,以便非技术用户可以编辑数据。这是我将 json 保存到 .CSV 文件时的样子:

{
  "Forecasts": [
    {
      "AccountNumber": "12345",
      "Period": "2022-02-01T00:00:00",
      "Field1": 3998.87968239,
      "Field2": 2133.91206875
    },
    {
      "AccountNumber": "12346",
      "Period": "2022-03-01T00:00:00",
      "Field1": 6741.483,
      "Field2": 4007.857
    }
  ]
}

我正在使用这行代码创建 .CSV 文件:

$json.Forecasts | ForEach-Object { $_ | Export-Csv -path $fileName -NoTypeInformation -Append -Force }

这很好用。在用户编辑数据并保存并关闭 .CSV 文件后,我需要将 .CSV 数据转换回看起来像原始 json 结构的 JArray(如上所示),以便我可以进行另一个 Invoke-WebRequest 调用(补丁) ,将 JArray 作为 Body 传递。

当我执行这行代码时:

$editedJson = Get-Content -Raw -Path "$fileName" | ConvertFrom-CSV | Select-Object -Property AccountNumber,Period,Field1,Field2 | ConvertTo-json

json 看起来像这样:

[
    {
        "AccountNumber":  "12345",
        "Period":  "2022-02-01T00:00:00",
        "Field1":  "3900.87968239",
        "Field2":  "2100.91206875"
    },
    {
        "AccountNumber":  "12346",
        "Period":  "2022-03-01T00:00:00",
        "Field1":  "6700.483",
        "Field2":  "4000.857"
    }
]

如您所见,它缺少 JArray 的“预测”部分,我不知道如何将 .CSV 数据恢复为这种格式。有人可以帮忙吗?

【问题讨论】:

  • 另一个区别是你所有的数字现在都是字符串。 CSV 中没有数据类型,这就是为什么最初将所有内容都视为字符串的原因。要实现输出数组的真正奇偶校验,您需要在调用ConvertTo-Json 之前将每条记录中受影响的字段显式转换为[double]。同样的想法也适用于其他数据类型。

标签: json powershell csv


【解决方案1】:

您只需使用该属性 (Forecasts) 创建一个对象并将导入的 CSV 附加到该属性:

# This line would be where you import the CSV:
# $csv = Import-Csv ..... 
$csv = @'
"AccountNumber","Period","Field1","Field2"
"12345","2/1/2022 12:00:00 AM","3998.87968239","2133.91206875"
"12346","3/1/2022 12:00:00 AM","6741.483","4007.857"
'@ | ConvertFrom-Csv

@{
    Forecasts = $csv
} | ConvertTo-Json

如果您想确保Forecasts 的 JSON 表示始终是一个数组(即使 CSV 只有一行):

@{
    Forecasts = [array]$csv
} | ConvertTo-Json

【讨论】:

  • 感谢您的回复。我在使用这里的字符串时遇到了困难,但我想通了。我收到以下异常:``` Invoke-WebRequest : {"Message":"请求无效。","MessageDetail":"参数字典包含方法'System.'的参数'body'的无效条目。 Net.Http.HttpResponseMessage HttpPatchForecast(Newtonsoft.Json.Linq.JArray, System.String)' in '....forecast.ForecastController'。字典包含类型为 'Newtonsoft.Json.Linq.JObject' 的值,但参数需要'Newtonsoft.Json.Linq.JArray'类型的值。"}```
  • @ILoveMarcyGirl 没问题。我建议您针对此错误消息提出一个新问题,添加用于 Web 请求的信息
  • @ILoveMarcyGirl 也许还可以看看this question,了解如何将JSON解析为Newtonsoft.Json.Linq.JArray
  • @Theo 这是一个 hack,但我能够通过这些行让 API 将主体识别为 JArray: $editedJson = @{Forecasts = [array]$csv} | ConvertTo-Json $editedJson = "[" + "$editedJson" + "]"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2021-09-11
  • 2012-02-16
  • 2018-01-29
  • 2011-03-05
相关资源
最近更新 更多