Powershell 2.0 - 将Javascript对象字符串转换为PS哈希表?

时间:2014-07-14 21:04:53

标签: regex json powershell hashtable

我在Powershell中有一个字符串,它是一个javascript对象。也就是说,它是从Javascript文件中剥离的一行文本,例如,我可能有

$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"

Javascript元素可能包含的值不仅包含字母数字字符,而且我认为我不能保证它们不会包含逗号。

我需要做的是将此变量转换为Powershell哈希表。

首先,我考虑将字符串转换为与ConvertFrom-StringData cmdlet匹配的语法。所以最终的结果就像......

$convertedstr = @'
prod_id = 123456789
prod_price = 100.00
prod_name = Creative Software Package
prod_img = https://mysite/images/123456789?$400x350$
prod_desc = Software - Package - PC - Win7 - x64
'@
$table = ConvertFrom-StringData $convertedstr
$table

Name                           Value
----                           -----
prod_desc                      Software - Package - PC - Win7 - x64
prod_name                      Creative Software Package
prod_id                        123456789
prod_img                       https://mysite/images/123456789?$400x350$
prod_price                     100.00

但是我不知道如何去完成字符串替换。我还找到了ConvertFrom-JSON cmdlet,但由于我在Powershell 2.0上,因此我无法使用它。

我曾尝试过像

这样的东西
$theline = $theline -Replace "\{'(\w+)':'(.+)',?\};",'$1 = $2`n'

但它并不像我想的那样匹配它。

$theline

prod_name = Creative Software Package','prod_id':'123456789','prod_price':'100.00`n

我明白为什么正则表达式匹配它是什么,但我不知道如何让它匹配每个“元素。”

对此有何想法?我愿意接受比这个字符串转换和正则表达式替换更容易的东西。

提前致谢。

1 个答案:

答案 0 :(得分:2)

从一开始修剪{,从结尾修剪};,这基本上会留下一组Key:Value对。然后只需创建一个PSCustomObject,并通过在,上拆分该数组并在每个数组上执行RegEx匹配为每对添加成员。

$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"
$JavaImport = New-Object PSObject
$theline.TrimStart("{").trimend("};").split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{Add-Member -InputObject $JavaImport -NotePropertyName ($Matches[1]) -NotePropertyValue ($Matches[2])}
PS C:\Users\TMTech> $JavaImport

prod_id    : 123456789
prod_price : 100.00
prod_name  : Creative Software Package
prod_img   : https://mysite/images/123456789?$
prod_desc  : Software - Package - PC - Win7 - x64

我刚刚意识到你想要一个哈希表。我的错。让我修改一下头发。

$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"
$JavaImport = @{}
$theline.TrimStart("{").trimend("};").split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{$JavaImport.add($Matches[1],$Matches[2])}
PS C:\Users\TMTech> $JavaImport

Name                           Value                                                                
----                           -----                                                                
prod_desc                      Software - Package - PC - Win7 - x64                                 
prod_img                       https://mysite/images/123456789?$                                    
prod_id                        123456789                                                            
prod_price                     100.00                                                               
prod_name                      Creative Software Package 

这已经被接受了,但我想我会在那里对原点进行评论。由于OP使用双引号输入它,我们实际上丢失了部分URL。我最终将其改为以下内容:

$theline = '''prod_id'':''123456789'',''prod_price'':''100.00'',''prod_name'':''Creative Software Package'',''prod_img'':''https://mysite/images/123456789?$400x350$'',''prod_desc'':''Software - Package - PC - Win7 - x64'''

这样我可以更好地匹配他想要的输入文本。之后我停止丢失URL上的$400x350。此外,RegEx转义是一个好主意,因此用户的最终解决方案是:

$theline = '''prod_id'':''123456789'',''prod_price'':''100.00'',''prod_name'':''Creative Software Package'',''prod_img'':''https://mysite/images/123456789?$400x350$'',''prod_desc'':''Software - Package - PC - Win7 - x64'''
$JavaImport = @{}
[regex]::escape($theline).split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{$JavaImport.add([regex]::unescape($Matches[1]),[regex]::unescape($Matches[2]))}