如果您在编译时不知道结构,那么就没有其他方法可以序列化 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)