コンパイル時に構造がわからない場合、JSON 文字列をシリアル化する方法は他にありません。それは Dictionary<string,object> でなければなりません。ただし、C# 4.0 を使用している場合は、DynamicObjectを使用できます。動的型付けでは型の解決が実行時まで延期されるため、このアプローチを使用してシリアル化すると、シリアル化されたオブジェクトを厳密に型指定されたものとして扱うことができます (ただし、コンパイル時のサポートはありません)。つまり、JSON スタイルのドット表記を使用してプロパティにアクセスできます。
MyDynamicJsonObject.key2
これを実現するには、DynamicObject から継承し、TryGetMemberメソッドを実装します (完全な実装があるこのリンクから引用)。
public class DynamicJsonObject : DynamicObject
{
private IDictionary<string, object> Dictionary { get; set; }
public DynamicJsonObject(IDictionary<string, object> dictionary)
{
this.Dictionary = dictionary;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.Dictionary[binder.Name];
if (result is IDictionary<string, object>)
{
result = new DynamicJsonObject(result as IDictionary<string, object>);
}
else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
{
result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
}
else if (result is ArrayList)
{
result = new List<object>((result as ArrayList).ToArray());
}
return this.Dictionary.ContainsKey(binder.Name);
}
}
現在、動的型付けはインデクサー表記をサポートしていないため、配列の場合は、次のような表記を使用して回避策を実装する必要があることに注意してください。
MyDynamicJsonObject.key2.Item(0)