【发布时间】:2021-01-08 15:30:04
【问题描述】:
我尝试创建一个脚本,将 csv 文件中给定的数据导入 API,为此,必须将 CSV 的每一行转换为 Json,然后发布到 API。
我在 csv 中的基础数据如下所示:
Users.Name,Users.Mail,Users.AdditionalInfo.String1,Users.AdditionalInfo.Int1
System.String,System.String,System.String,System.Int32
MyName,my@name.com,Hello,1
YourName,your@name.com,GoodBye,2
第一行包含 Json 信息,其中“用户”是数据写入的 API 资源。 “用户”也可以是通过 API 访问的任何其他对象,请参阅下面的评论。
第二行是标识值的类型。这是以后用的,暂时不用,从第三行开始是数据。
“。”用于指定嵌套的“级别”,所以第一个“.”将 API 对象与 json 中的第一级、第二个“.”分开。第一级从第二级。
我希望像这样返回 Json:
{
"Name": "MyName",
"Mail": "my@mail.com",
"AdditionalInfo": {
"String1": "Hello",
"Int1": 1
}
}
我使用以下代码:
$objects = Import-Csv "test.csv" -Encoding UTF8
$validObjects = $objects | Select-Object -Skip 1
$validObjects
ForEach ($object in $validObjects) {
#$apiObject = ($object.psobject.properties.name).Split(".")[0]
$jsonObject = @{}
ForEach ($property in $object.psobject.properties) {
switch($property.Name.Split(".").Count - 1) {
1 {
$jsonObject.Add($property.Name.Split(".")[1], $property.Value)
}
2 {
$tempJsonObject = @{$property.Name.Split(".")[2] = $property.Value}
$jsonObject.Add($property.Name.Split(".")[1], $tempJsonObject)
}
}
}
$jsonObject | ConvertTo-Json
#@($object.psobject.properties).Count
}
我现在面临的问题是,由于我有两个以“Users.AdditionalInfo”开头的列,因此会遇到错误,因为您只能将“AdditionalInfo”作为键添加一次。有没有简单的方法?
【问题讨论】:
-
正如我在发布(现已删除)的答案中提到的,鉴于 CSV 数据可能适用于具有不同属性的计算机,无论是用户还是计算机,是否总是会有“附加信息”?
-
为什么会被删除?
-
@DougMaurer OP 作为评论添加:'标题中的标签都不是固定的,例如,如果您要导入计算机,它们都将以“computers.”开头,以及不同的字段,例如"computers.name,computers.ip,..." ' 表示我的回答无效。
-
@Robin 是的,我注意到我在同一条船上。
-
@Robin,没有 AdditionalInfo 只是一个例子,可能还有更多,或者没有。
标签: json powershell csv nested