PowerShell 2.0 ConvertFrom-Json和ConvertTo-Json实现异常“检测到循环引用”

时间:2016-01-20 09:57:14

标签: json powershell powershell-v2.0

我正在使用函数来序列化和反序列化Powershell 2.0中的对象PowerShell 2.0 ConvertFrom-Json and ConvertTo-Json implementation

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 个答案:

答案 0 :(得分:2)

代码中有两个问题:

  1. PowerShell枚举集合,因此不是一个数组ConvertFrom-Json20返回两个字典。这本身并不重要,但是:
  2. PowerShell v2中的
  3. return语句通过PSObject包装返回的对象。结果$o包含两个PSObject的数组,而JSON序列化程序无法正常使用它们。
  4. 要防止收集枚举,您可以使用一元逗号运算符。此运算符使用单个元素创建数组,并且将枚举数组而不是集合。而且,由于即使没有return语句,PowerShell也会返回输出,您可以将其删除。