REST サービスと対話し、JSON を動的オブジェクトとして逆シリアル化する C# コマンドレットがあります ( ExpandoObject
)。expando が渡されると、辞書としてパイプラインに書き込まれるため、次のようなものからそのプロパティにアクセスできるようにするために、WriteObject
それを like に変換しています。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
、それともオブジェクト階層を表すことができるのか? もしそうなら、ネストされたオブジェクトをどのように表現して、そのプロパティを選択できるようにするか、またはオブジェクト階層を平坦化する必要がありますか?