例如,有一个像下一个的对象:
public class Container
{
public object Data { get; set; }
}
它以这种方式使用:
Container container = new Container
{
Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};
如果我反序列化从序列化上述实例获得的JSON字符串Data
属性,即使我提供ExpandoObjectConverter
,它也不会被反序列化为ExpandoObject
:
Container container = JsonConvert.Deserialize<Container>(jsonText, new ExpandoObjectConverter());
如何反序列化使用匿名对象分配的类属性,或者至少将具体类型反序列为ExpandoObject
?
有人回答说我可以使用动态对象。这对我不起作用。我知道我可以这样做,但事实并非如此,因为我需要一个ExpandoObject。 感谢。
其他一些用户回答我可以将JSON字符串反序列化为ExpandoObject
。这不是这个问题的目标。我需要反序列化具有动态属性的具体类型。在JSON字符串中,此属性可以是关联数组。
答案 0 :(得分:28)
试试这个:
Container container = new Container
{
Data = new Dictionary<string, object> { { "Text", "Hello world" } }
};
string jsonText = JsonConvert.SerializeObject(container);
var obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonText, new ExpandoObjectConverter());
我发现通过调用ExpandoObject
,这样做了DeserializeObject
。我认为您提供的代码的问题是,当您提供ExpandoObjectConverter
时,您要求Json.Net
反序列化Container
,因此我会想象ExpandoObjectConverter
没有被使用。
修改强>
如果我用Data
装饰[JsonConverter(typeof(ExpandoObjectConverter))]
属性并使用代码:
var obj = JsonConvert.DeserializeObject<Container>(jsonText);
然后Data
属性被反序列化为ExpandoObject
,而obj
是Container
。