我有一个与 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
一组名称值对还是它们可以代表一个对象层次结构?如果是这样,如何表示嵌套对象以使其属性可选,或者是否有必要展平对象层次结构?