从CSV文件中读取数据并将一个数据框转换为JSON Invoke-WebRequest

时间:2016-01-14 18:44:50

标签: json csv powershell webrequest

在包含3列(方法,网址,正文)和以下数据(inputdata.csv)的CSV文件中:

POST  https://xyz/abc  {phoneNumber=@{number='2222222' areaCode='345'}}

以下是powershell代码:

$ServiceDetails = Import-Csv .\inputdata.csv
foreach ($ServiceDetail in $ServiceDetails)
{$full = "@" + $ServiceDetail.Body 
$Body = $full | ConvertTo-Json
$Response = Invoke-WebRequest -Method $ServiceDetail.Method -Uri $ServiceDetail.URL -Headers $RequestHeader -Body $Body }

执行时,我收到以下错误:

Invoke-WebRequest : {"message":"Bad Request","uuid":"1132131"}

当我检查$Body时,它还没有转换为JSON格式。它看起来像这样:

"@{phoneNumber=@{number=\u00272222222\u0027\nareaCode=\u0027345\u0027}}"

如何将数据从CSV转换为JSON?

1 个答案:

答案 0 :(得分:0)

@AnthonyStringer在这里提出了解决方案。这里的问题有两个问题。首先,您对字符串而不是对象运行ConvertTo-Json,因此无需转换。其次,您的字符串没有正确格式化为有效对象,因此我们甚至无法将其转换为一个,然后转换为JSON。让我们从顶部开始吧。将字符串转换为哈希表的方法很简单,您可以在其上运行Invoke-Expression cmdlet:

"@" + $ServiceDetail.Body | Invoke-Expression

现在,如果字符串是一个有效的表达式,它会处理它。在这种情况下,您希望它是一对哈希表,但内部哈希表是不对的。它在第一个和第二个键/值对之间缺少分号。你怎么解决这个问题?伙计,那是一个艰难的人。格式不正确的代码很难,因为错误可能并不总是一致的。现在,由于我们正在使用哈希表,我们可以通过正则表达式运行它来查找键/值对,将它们拆分成一个数组,然后用分号连接数组。实际上,这听起来是一个相当不错的主意,所以让我们这样做。这有点令人费解,但希望你能在这里继续。我将从您刚定义$full的位置开始,但出于我们的目的,我只是将$full设置为示例中的字符串。

$full = "@{phoneNumber=@{number='2222222' areaCode='345'}}"
$body = ([regex]"^.*?@\{((?:(?:\w+)=(?:'.*?')\s?)+)}.*$").matches($full)|%{
    $Fixed = ($_.Groups[1].value -split "((?:\w+)=(?:'.*?'))" -join ';').trim(';')
    $_.value -replace [regex]::escape($_.Groups[1].value), "$Fixed"
}|Invoke-Expression|ConvertTo-Json -Compress

好的,$body现在的值为:

{"phoneNumber":{"areaCode":"345","number":"2222222"}}

那是有效的JSON,你应该全力以赴。现在,如果我做了一些假设,这可能会更简单,例如,所有嵌套的哈希表将具有完全相同的内容格式 number =' #######' areaCode =' ###' 但这似乎是一个坏主意,因为你只给了我们一个示例行,其他行几乎可以包含我们所知道的任何内容。所以,这应该适用于你需要修复它的任何东西,假设它们只是具有仅由空格分隔的键/值对的哈希表。

如果其他人看到了简化代码的好方法,请随意!