PowerShell 2.0 ConvertFrom-Json 和 ConvertTo-Json 实现异常 "A circular reference was detected"
PowerShell 2.0 ConvertFrom-Json and ConvertTo-Json implementation exception "A circular reference was detected"
我正在使用问题
中的函数对 Powershell 2.0 中的对象进行序列化和反序列化
function ConvertTo-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
return $ps_js.Serialize($item)
}
function ConvertFrom-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
return $ps_js.DeserializeObject($item)
}
但是当我 运行 例如:
$json = "[{'a':'b'},{'c':'d'}]"
$o = ConvertFrom-Json20 $json
$newJson = ConvertTo-Json20 $o
我遇到错误:
Exception calling "Serialize" with "1" argument(s): "A circular reference was detected while serializing an object of t
ype 'System.Management.Automation.PSParameterizedProperty'."
At line:4 char:28
+ return $ps_js.Serialize <<<< ($item)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
我该如何解决这个错误?
P.S。
我提前道歉。原来问题什么的不能加评论...
代码中有两个问题:
- PowerShell 枚举集合,因此不是一个数组
ConvertFrom-Json20
return 两个字典。它本身没什么大不了的,但是:
PowerShell v2 中的 return
语句通过 PSObject
包装 returned 对象。结果 $o
包含带有两个 PSObject
的数组,并且 JSON 序列化程序无法正常使用它们。
要防止集合枚举,您可以使用一元逗号运算符。此运算符创建具有单个元素的数组,数组将被枚举而不是集合。由于 PowerShell return 即使没有 return
语句也能输出,你可以删除它。
我正在使用问题
function ConvertTo-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
return $ps_js.Serialize($item)
}
function ConvertFrom-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
return $ps_js.DeserializeObject($item)
}
但是当我 运行 例如:
$json = "[{'a':'b'},{'c':'d'}]"
$o = ConvertFrom-Json20 $json
$newJson = ConvertTo-Json20 $o
我遇到错误:
Exception calling "Serialize" with "1" argument(s): "A circular reference was detected while serializing an object of t
ype 'System.Management.Automation.PSParameterizedProperty'."
At line:4 char:28
+ return $ps_js.Serialize <<<< ($item)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
我该如何解决这个错误?
P.S。 我提前道歉。原来问题什么的不能加评论...
代码中有两个问题:
- PowerShell 枚举集合,因此不是一个数组
ConvertFrom-Json20
return 两个字典。它本身没什么大不了的,但是:
PowerShell v2 中的 return
语句通过PSObject
包装 returned 对象。结果$o
包含带有两个PSObject
的数组,并且 JSON 序列化程序无法正常使用它们。
要防止集合枚举,您可以使用一元逗号运算符。此运算符创建具有单个元素的数组,数组将被枚举而不是集合。由于 PowerShell return 即使没有 return
语句也能输出,你可以删除它。