【发布时间】:2020-09-08 07:15:20
【问题描述】:
背景:我正在尝试遍历 REST API 响应并使用该信息来填充 mysql 数据库。我的问题是某些对象缺少标签,因此数据与我当前的脚本不正确对齐。
JSON 示例:在此示例中,espl002 缺少主 IP 地址标记。
{
"cis" : [ {
"udbId" : "40000c5e6b84af5588aa066a1569b17e",
"globalId" : "40000c5e6b84af5588aa066a1569b17e",
"type" : "netprinter",
"properties" : {
"discovered_vendor" : "Fuji Xerox",
"name" : "xrx9c934e19ffa5",
"global_id" : "40000c5e6b84af5588aa066a1569b17e",
"primary_ip_address" : "182.19.323.23"
}
}, {
"udbId" : "400050e64747c97b80a41358b7810c29",
"globalId" : "400050e64747c97b80a41358b7810c29",
"type" : "netprinter",
"properties" : {
"discovered_vendor" : "Fuji Xerox",
"name" : "phaser 4510n",
"global_id" : "400050e64747c97b80a41358b7810c29",
"primary_ip_address" : "182.19.323.21"
}
}, {
"udbId" : "4ffc72d7151c94ae850837effb45f3c2",
"globalId" : "4ffc72d7151c94ae850837effb45f3c2",
"type" : "netprinter",
"properties" : {
"discovered_vendor" : "Fuji Xerox",
"name" : "espl002",
"global_id" : "4ffc72d7151c94ae850837effb45f3c2",
}
} ],
"relations" : null
}
当前正在使用的代码:
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
[void][System.Reflection.Assembly]::LoadFrom(“C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.20\Assemblies\v4.5.2\MySql.Data.dll”)
$token ="eyJ0eXAiOiJKV1QiLCJhbGl0b3J5IjoiVUNNREIiLCJleHAiOjE1ODk4MjgyNzUsImN1c3RvbWVyIjoxLCJ1c2VybmFtZSI6Im1zaW5naCJ9.AsOXTrVu8BIU2XUfk7_fxbMkwhylvBTsRHJ-imuP0mk"
#Total Printers
$params = @{
Uri = 'https://test.ca/rest-api/topology'
Headers = @{ 'Authorization' = "Bearer $token" }
Method = 'POST'
Body = 'totalprinters'
ContentType = 'application/json'
Outfile = 'C:\Users\test\Desktop\API\TOTALPRINTERS.json'
}
Invoke-RestMethod @params
$json = Get-Content -Raw -Path C:\Users\test\Desktop\API\TOTALPRINTERS.json
$jsonserial = New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer
$jsonserial.MaxJsonLength = [int]::MaxValue
$Obj = $jsonserial.DeserializeObject($json)
$Totalprinters= $obj.cis.properties.global_id.count #Total printers count
$limit = $obj.cis.properties.global_id.count
$Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$ConnectionString = “server=187.15.43.434;uid=test;pwd=CM123$;database=test;pooling=false”
$Connection.ConnectionString = $ConnectionString
$Connection.Open()
$datasend = For ($i = 0; $i -lt $limit; $i++) {
$nameofprinter=$obj.cis.properties.name[$i]
$ipofprinter=$obj.cis.properties.primary_ip_address[$i]
$manufacturerofprinter=$obj.cis.properties.discovered_vendor[$i]
$Query = "INSERT INTO printers (name,ip,manufacturer, Divison) VALUES ('$nameofprinter','$ipofprinter','$manufacturerofprinter',' ')"
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $Connection)
$DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
$DataSet = New-Object System.Data.DataSet
$RecordCount = $dataAdapter.Fill($dataSet, "data")
}
尝试解决方案:根据一些研究,我相信将对象分配给哈希表可以解决我的问题,然后将这些数据发送到 mysql 数据库。不幸的是,我仍在学习 powershell 并且不太确定如何在此示例中执行此操作。
【问题讨论】:
-
为什么不使用
ConvertFrom-Json? -
这个
Union-Object可能会帮助您对齐属性。 -
@iRon ,我之前有covertfrom-json 但是实际的rest api响应太大而无法使用它。将看看Union-Object
-
这是单个 REST 响应还是多个? (单个响应有多大?)如果涉及多个对象,您是否尝试通过正确使用 PowerShell 管道(而不是将所有 PowerShell 对象收集到内存中)来流式传输每个对象?
-
@iRon 它的单个 REST 响应,大约 10 mb 超过 10000 行
标签: json powershell rest