【问题标题】:Iterating through JSON objects with missing tags using powershell使用 powershell 遍历缺少标签的 JSON 对象
【发布时间】: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


【解决方案1】:

感谢大家的帮助,我没有正确地流式传输每个对象。修改脚本并使用 hashtable 。

[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls13  
[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”)
$Connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$ConnectionString = “server=199.32.3.3;uid=test;pwd=CM$;database=test;pooling=false”
$Connection.ConnectionString = $ConnectionString
$Connection.Open()

$json  = Get-Content -Raw -Path "C:\Users\test\Desktop\API\TOTALPRINTERS.json"

$jsonParts = $json -split "udbId"" :"

for ($part_Index = 1;$part_Index -lt $jsonParts.Length;$part_Index++)
{
$jsonPart = $jsonParts[$part_Index]
$name = ($jsonPart -split """name"" :")[1]
$name = ($name -split """")[1]
$name=$name -replace("'","")

$ip = ($jsonPart -split """primary_ip_address"" :")[1]
$ip = ($ip -split """")[1]

$manufacturer = ($jsonPart -split """discovered_vendor"" :")[1]
$manufacturer = ($manufacturer -split """")[1]

$Division = ""

$Query="INSERT INTO printers(name,ip,manufacturer,Divison) VALUES('$name','$ip','$manufacturer','$Divison')"
$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")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2017-10-30
    • 2021-11-22
    • 2021-01-11
    • 2015-01-11
    相关资源
    最近更新 更多