1

我有一个与 REST 服务交互的 C# Cmdlet,将 JSON 反序列化为动态对象 ( ExpandoObject)。当将 expando 传递给WriteObject它时,它会作为字典写入管道,因此我将其转换为PSObject类似的,以便使其属性可供以下人员访问Select-Object

protected void WriteDynamicObject(dynamic o)
{
    var psObject = ConvertToPSObject(o);
    WriteObject(psObject);
}

private static PSObject ConvertToPSObject(dynamic o)
{
    var d = o as IDictionary<string, object>;
    Debug.Assert(d != null);

    var record = new PSObject();
    foreach (var kvp in d)
    {
        // if the value is itself an expando, convert it recursively
        var value = kvp.Value is ExpandoObject ? ConvertToPSObject(kvp.Value) : kvp.Value;

        record.Properties.Add(new PSNoteProperty(kvp.Key, value));
    }

    return record;
}

这适用于所有动态对象的属性,除了本身是复杂类型的属性。上面的代码将递归地将非标量子对象转换为 PSObject 实例。例如,此 JSON 结果的 projectTeam 属性转换为 PSOBject:

{
   "kind": "storage#bucketAccessControl",
   "role": "OWNER",
   "projectTeam": {
    "projectNumber": "930617506804",
    "team": "owners"
   },
   "etag": "CAE="
  }

当我尝试projectTeam从管道中选择属性时,我得到一个字符串表示并且无法选择该子对象的属性:

projectTeam
-----------
@{projectNumber=930617506804; team=owners}
@{projectNumber=930617506804; team=editors}
@{projectNumber=930617506804; team=viewers}

我想我希望能够选择或以其他方式导航对象层次结构。本质上是PSObjects一组名称值对还是它们可以代表一个对象层次结构?如果是这样,如何表示嵌套对象以使其属性可选,或者是否有必要展平对象层次结构?

4

0 回答 0