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。 我提前道歉。原来问题什么的不能加评论...

代码中有两个问题:

  1. PowerShell 枚举集合,因此不是一个数组 ConvertFrom-Json20 return 两个字典。它本身没什么大不了的,但是:
  2. PowerShell v2 中的
  3. return 语句通过 PSObject 包装 returned 对象。结果 $o 包含带有两个 PSObject 的数组,并且 JSON 序列化程序无法正常使用它们。

要防止集合枚举,您可以使用一元逗号运算符。此运算符创建具有单个元素的数组,数组将被枚举而不是集合。由于 PowerShell return 即使没有 return 语句也能输出,你可以删除它。