我已经能够在一定程度上成功解析一些 JSON,但无法访问特定对象:
我的整体代码:
$myFile = Get-Content -Raw -Path UKStore.json | ConvertFrom-Json
$counter = 0
foreach ($link in $myFile.links)
{
Write-Host $link.id "and" $link.name
Write-Host $link.default_sku
$counter+=1
}
Write-Host $counter
Read-Host -Prompt "Press Enter to exit"
现在,我每次迭代得到的结果如下所示。因此,第 1 行很棒,正在输出我需要的内容,但第 2 行需要进一步处理:
EP9000-NPEE00001_00-GCRASHBAND000001 and Crash Bandicoot®
@{amortizeFlag=False; bundleExclusiveFlag=False; chargeImmediatelyFlag=False; charge_type_id=0; credit_card_required_flag=0; defaultSku=True; display_price=£3.99; eligibilities=System.Object[]; entitlements=System.Object[]; id=EP9000-NPEE00001_00-GCRASHBAND000001-EE03; is_original=False; name=Full Game; platforms=System.Object[]; price=399; rewards=System.Object[]; seasonPassExclusiveFlag=False; skuAvailabilityOverrideFlag=False; sku_type=0; type=standard}
我根本无法,无论我尝试使用什么符号来访问“$link.default_sku”中的属性,我显然没有在我的大脑中连接某些东西,但我觉得:
$link.default_sku.display_price
上面的对象应该给我 3.99 英镑的价值,但我什么也没得到。任何帮助克服这种心理障碍的帮助都会很棒。
格式自定义更上一层楼
$link | Format-Custom
Output:
class PSCustomObject
{
bucket = games
container_type = product
content_type = 1
default_sku = @{amortizeFlag=False; bundleExclusiveFlag=False; chargeImmediatelyFlag=False; charge_type_id=0;
credit_card_required_flag=0; defaultSku=True; display_price=£24.99; eligibilities=System.Object[];
entitlements=System.Object[]; id=EP2595-CUSA07370_00-0001000100010001-E001; is_original=False; name=Full Game;
platforms=System.Object[]; price=2499; rewards=System.Object[]; seasonPassExclusiveFlag=False;
skuAvailabilityOverrideFlag=False; sku_type=0; type=standard}
gameContentTypesList =
game_contentType = Full Game
id = EP2595-CUSA07370_00-0001000100010001
images =
name = Past Cure™
playable_platform = PS4™
provider_name = Phantom 8 Studio UG
release_date =
class DateTime
{
Date =
class DateTime
{
Date =
class DateTime
{
Date =
class DateTime
{
Date =
class DateTime
{
Date = 23/02/2018 00:00:00
Day = 23
DayOfWeek = Friday
DayOfYear = 54
Hour = 0
Kind = Utc
Millisecond = 0
Minute = 0
Month = 2
Second = 0
Ticks = 636549408000000000
TimeOfDay = 00:00:00
Year = 2018
DateTime = 23 February 2018 00:00:00
}
Day = 23
DayOfWeek = Friday
DayOfYear = 54
Hour = 0
Kind = Utc
Millisecond = 0
Minute = 0
Month = 2
Second = 0
Ticks = 636549408000000000
TimeOfDay =
class TimeSpan
{
Ticks = 0
Days = 0
Hours = 0
Milliseconds = 0
Minutes = 0
Seconds = 0
TotalDays = 0
TotalHours = 0
TotalMilliseconds = 0
TotalMinutes = 0
TotalSeconds = 0
}
Year = 2018
DateTime = 23 February 2018 00:00:00
}
Day = 23
DayOfWeek = Friday
DayOfYear = 54
Hour = 0
Kind = Utc
Millisecond = 0
Minute = 0
Month = 2
Second = 0
Ticks = 636549408000000000
TimeOfDay =
class TimeSpan
{
Ticks = 0
Days = 0
Hours = 0
Milliseconds = 0
Minutes = 0
Seconds = 0
TotalDays = 0
TotalHours = 0
TotalMilliseconds = 0
TotalMinutes = 0
TotalSeconds = 0
}
Year = 2018
DateTime = 23 February 2018 00:00:00
}
Day = 23
DayOfWeek = Friday
DayOfYear = 54
Hour = 0
Kind = Utc
Millisecond = 0
Minute = 0
Month = 2
Second = 0
Ticks = 636549408000000000
TimeOfDay =
class TimeSpan
{
Ticks = 0
Days = 0
Hours = 0
Milliseconds = 0
Minutes = 0
Seconds = 0
TotalDays = 0
TotalHours = 0
TotalMilliseconds = 0
TotalMinutes = 0
TotalSeconds = 0
}
Year = 2018
DateTime = 23 February 2018 00:00:00
}
Day = 23
DayOfWeek = Friday
DayOfYear = 54
Hour = 0
Kind = Utc
Millisecond = 0
Minute = 0
Month = 2
Second = 0
Ticks = 636549408000000000
TimeOfDay =
class TimeSpan
{
Ticks = 0
Days = 0
Hours = 0
Milliseconds = 0
Minutes = 0
Seconds = 0
TotalDays = 0
TotalHours = 0
TotalMilliseconds = 0
TotalMinutes = 0
TotalSeconds = 0
}
Year = 2018
DateTime = 23 February 2018 00:00:00
}
restricted = False
revision = 15
short_name = Past Cure™
timestamp = 1648353047000
top_category = downloadable_game
url = https://store.playstation.com/store/api/chihiro/00_09_000/container/GB/en/999/EP2595-CUSA07370_00-0001000100010
001/1648353047
}
$link.default_sku
包含一个string,不是嵌套对象,这就是为什么$link.default_sku.display_price
不起作用。
That 字符串恰好是字符串化嵌套的[pscsutomobject]
,就像您通过字符串插值得到的那样(例如,"$([pscustomobject] @{ foo=1; bar =2 })"
或者 - 最有可能在这种情况下 - 当在期间超过默认递归深度 2 时creationJSON 文本使用ConvertTo-Json https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/convertto-json,一个常见且令人遗憾的陷阱 - 请参阅这个帖子 https://stackoverflow.com/q/53583677/45375.
您有两个选择:
-
从源头解决问题,通过传递一个-Depth
论点足够高ConvertTo-Json
以防止截断时UKStore.json
文件已创建。
-
如果这不是一个选择,你将不得不do 文本解析从字符串中提取感兴趣的值。但请注意,这通常不是robust,因为字符串化格式[pscustomobject]
s 是针对人类观察者的,而不是针对程序化的加工。值得注意的是,带有空格的字符串值周围的引号会丢失:
# -> '£24.99'
$link.default_sku -replace '(?s).+\bdisplay_price=([^;]+).+', '$1'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)