如果你不知道在编译时的结构,那么就没有其他办法来序列化一个JSON string--它必须是词典<字符串,对象>。但是,如果您使用C#4.0,则可以使用DynamicObject。由于动态类型化将类型解析延迟到运行时,如果使用此方法进行序列化,则可以将序列化对象视为强类型对象(尽管无需编译时支持)。这意味着你可以使用JSON式的点标记来访问属性:
MyDynamicJsonObject.key2
要做到这一点,你可以从DynamicObject继承,并实现TryGetMember方法(quoted from this link, which has a full implementation):
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);
}
}
注意动态类型目前不支持索引器表示法,因此对于数组,您需要implement a workaround using notation like this:
MyDynamicJsonObject.key2.Item(0)
它是你写的一个固定的结构,还是你在寻找一个通用的解决方案? – McGarnagle
通用解决方案,假设我们不知道结构... – HydPhani