Invoke-RestMethod不会从JSON中创建PS对象

时间:2016-04-29 23:29:57

标签: json powershell

我试图从JSON文件中获取一些信息,以便使用PowerShell进行处理。 我使用 Invoke-RestMethod ,基本上它可以工作:

$json = Invoke-RestMethod -Uri http://www.pgatour.com/data/r/012/leaderboard-v2.json

结果我得到了PSCustomObject,这就是我需要的东西。我可以立即访问其属性并获取所需数据。 但是,相同的方法对某些JSON文件不起作用,例如:对于 http://www.pgatour.com/data/r/current/schedule-v2.json 结果不是PSCustomObject,而是一个字符串。

为什么它适用于一个JSON并且不适用于另一个JSON?它们都是有效的JSON。有没有办法让PSCustomObject脱离第二个JSON?

1 个答案:

答案 0 :(得分:2)

回答最后一个问题:尝试ConvertFrom-Json将JSON字符串转换为常规PS对象。

  

ConvertFrom-Json cmdlet将JSON格式的字符串转换为   自定义对象(PSCustomObject),其中包含每个字段的属性   JSON字符串。 ...此cmdlet是在Windows PowerShell中引入的   3.0。

     

https://technet.microsoft.com/library/3612c3f9-2153-4a1e-aebc-3092d707d567(v=wps.630).aspx

为了完整性'为了这个目的,请使用ConvertTo-Json返回。

至于为什么它适用于一个而不是另一个...使用此处给出的示例URI和Convert*-Json cmdlet进行测试,第一个转换为精细,但第二个不转换。这可能与每个示例之间行为不同的原因有关。

ConvertFrom-Json : Cannot process argument because the value of argument "name" is not valid. 
Change the value of the "name" argument and run the operation again.

第二个URI的响应中有一些东西导致了字符串到JSON转换的问题。第二个API返回一个大字符串(172667个字符)。这不是很大但是......

  1. this page on Reddit,显示了为了处理更长的JSON字符串而需要编写的函数,
  2. 以下StackOverflow Q& A涵盖了转换大型JSON字符串的问题:ConvertFrom-Json max length
  3. 使用其中任何一个链接中的函数/代码与第二个API返回的数据确实产生了一个对象:

    PS> ConvertFrom-Json2 -InputObject $json2
    
    header       : {[version, 0.0]}
    _comment     : This will be replaced with a separate file in the future.
    thisWeek     : {[weekNumber, 17], [startDate, 2016-04-17], [endDate, 2016-04-24]}
    currentYears : {[r, 2016], [s, 2016], [h, 2016], [c, 2016]...}
    years        : {System.Collections.Generic.Dictionary`2[System.String,System.Object]}
    

    呼!